diff --git a/analysis_options.yaml b/analysis_options.yaml index 7c7ffc8e20e..110a84eb9dc 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -67,6 +67,7 @@ linter: # - constant_identifier_names # https://github.com/dart-lang/linter/issues/204 - control_flow_in_finally - directives_ordering + - discarded_futures - empty_catches - empty_constructor_bodies - empty_statements diff --git a/case_study/memory_leaks/memory_leak_app/lib/main.dart b/case_study/memory_leaks/memory_leak_app/lib/main.dart index f853ed766f0..326b1d6b21f 100644 --- a/case_study/memory_leaks/memory_leak_app/lib/main.dart +++ b/case_study/memory_leaks/memory_leak_app/lib/main.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. +import 'dart:async'; + import 'package:flutter/material.dart'; import 'about.dart'; @@ -86,15 +88,19 @@ class MyHomeState extends State with SingleTickerProviderStateMixin { void showMenuSelection(String value) { switch (value) { case logMenu: - Navigator.push( - context, - MaterialPageRoute(builder: (context) => Logger()), + unawaited( + Navigator.push( + context, + MaterialPageRoute(builder: (context) => Logger()), + ), ); break; case aboutMenu: - Navigator.push( - context, - MaterialPageRoute(builder: (context) => About()), + unawaited( + Navigator.push( + context, + MaterialPageRoute(builder: (context) => About()), + ), ); break; default: diff --git a/case_study/memory_leaks/memory_leak_app/lib/tabs/http_data.dart b/case_study/memory_leaks/memory_leak_app/lib/tabs/http_data.dart index 80b56df37fc..469f791a9f1 100644 --- a/case_study/memory_leaks/memory_leak_app/lib/tabs/http_data.dart +++ b/case_study/memory_leaks/memory_leak_app/lib/tabs/http_data.dart @@ -144,6 +144,6 @@ class MyGetHttpDataState extends State { super.initState(); // Call the getJSONData() method when the app initializes - getJSONData(); + unawaited(getJSONData()); } } diff --git a/case_study/memory_leaks/memory_leak_app/lib/tabs/logger.dart b/case_study/memory_leaks/memory_leak_app/lib/tabs/logger.dart index 894768af63c..f311695742b 100644 --- a/case_study/memory_leaks/memory_leak_app/lib/tabs/logger.dart +++ b/case_study/memory_leaks/memory_leak_app/lib/tabs/logger.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. +import 'dart:async'; + import 'package:flutter/material.dart'; import '../common.dart'; @@ -34,31 +36,33 @@ class LoggerState extends State { // ignore: unused_element void _pushSaved() { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) { - final tiles = _saved.map( - (itemValue) { - return ListTile( - title: Text( - itemValue, - style: _biggerFont, - ), - ); - }, - ); - final divided = ListTile.divideTiles( - context: context, - tiles: tiles, - ).toList(); + unawaited( + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) { + final tiles = _saved.map( + (itemValue) { + return ListTile( + title: Text( + itemValue, + style: _biggerFont, + ), + ); + }, + ); + final divided = ListTile.divideTiles( + context: context, + tiles: tiles, + ).toList(); - return Scaffold( - appBar: AppBar( - title: const Text('Saved lists'), - ), - body: ListView(children: divided), - ); - }, + return Scaffold( + appBar: AppBar( + title: const Text('Saved lists'), + ), + body: ListView(children: divided), + ); + }, + ), ), ); } diff --git a/case_study/memory_leaks/memory_leak_app/lib/tabs/settings.dart b/case_study/memory_leaks/memory_leak_app/lib/tabs/settings.dart index 6cfc1e5a9b4..1c9ec8493d8 100644 --- a/case_study/memory_leaks/memory_leak_app/lib/tabs/settings.dart +++ b/case_study/memory_leaks/memory_leak_app/lib/tabs/settings.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. +import 'dart:async'; + import 'package:flutter/material.dart'; import '../logging.dart'; @@ -61,9 +63,11 @@ class SettingsState extends State { restfulApi = key; }); // Display the data received. - Navigator.push( - context, - MaterialPageRoute(builder: (context) => MyGetHttpData()), + unawaited( + Navigator.push( + context, + MaterialPageRoute(builder: (context) => MyGetHttpData()), + ), ); }, ); diff --git a/case_study/platform_channel/lib/channel_demo.dart b/case_study/platform_channel/lib/channel_demo.dart index 9c55238e579..1aa9cce793b 100644 --- a/case_study/platform_channel/lib/channel_demo.dart +++ b/case_study/platform_channel/lib/channel_demo.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -14,7 +16,7 @@ class _ChannelDemoState extends State { late String _response; void _sendMessage() { - _channel.send('Message from Dart'); + unawaited(_channel.send('Message from Dart')); } void _reset() { diff --git a/case_study/platform_channel/lib/main.dart b/case_study/platform_channel/lib/main.dart index 53c4aed6216..34ddf95306f 100644 --- a/case_study/platform_channel/lib/main.dart +++ b/case_study/platform_channel/lib/main.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'channel_demo.dart'; @@ -30,9 +32,11 @@ class _HomePage extends StatelessWidget { child: TextButton( style: TextButton.styleFrom(backgroundColor: Colors.green), onPressed: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => ChannelDemo()), + unawaited( + Navigator.push( + context, + MaterialPageRoute(builder: (context) => ChannelDemo()), + ), ); }, child: const Text( diff --git a/packages/devtools_app/lib/src/analytics/analytics_controller.dart b/packages/devtools_app/lib/src/analytics/analytics_controller.dart index d52f76e61a8..d47548ebc5f 100644 --- a/packages/devtools_app/lib/src/analytics/analytics_controller.dart +++ b/packages/devtools_app/lib/src/analytics/analytics_controller.dart @@ -24,7 +24,7 @@ class AnalyticsController { }) : _analyticsEnabled = ValueNotifier(enabled), _shouldPrompt = ValueNotifier(firstRun && !enabled) { if (_shouldPrompt.value) { - toggleAnalyticsEnabled(true); + unawaited(toggleAnalyticsEnabled(true)); } if (_analyticsEnabled.value) { setUpAnalytics(); diff --git a/packages/devtools_app/lib/src/analytics/prompt.dart b/packages/devtools_app/lib/src/analytics/prompt.dart index 06cd1392ef3..948832c99cd 100644 --- a/packages/devtools_app/lib/src/analytics/prompt.dart +++ b/packages/devtools_app/lib/src/analytics/prompt.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. +import 'dart:async'; + import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; @@ -105,9 +107,11 @@ class _AnalyticsPromptState extends State textTheme.titleMedium?.copyWith(color: const Color(0xFF54C1EF)), recognizer: TapGestureRecognizer() ..onTap = () { - launchUrl( - 'https://www.google.com/intl/en/policies/privacy', - context, + unawaited( + launchUrl( + 'https://www.google.com/intl/en/policies/privacy', + context, + ), ); }, ), @@ -127,7 +131,7 @@ class _AnalyticsPromptState extends State ElevatedButton( onPressed: () { // This will also hide the prompt. - controller.toggleAnalyticsEnabled(false); + unawaited(controller.toggleAnalyticsEnabled(false)); }, style: ElevatedButton.styleFrom(backgroundColor: Colors.grey), child: const Text('No thanks.'), @@ -137,9 +141,8 @@ class _AnalyticsPromptState extends State ), ElevatedButton( onPressed: () { - controller - ..toggleAnalyticsEnabled(true) - ..hidePrompt(); + unawaited(controller.toggleAnalyticsEnabled(true)); + controller.hidePrompt(); }, child: const Text('Sounds good!'), ), diff --git a/packages/devtools_app/lib/src/app.dart b/packages/devtools_app/lib/src/app.dart index ad514c32564..ea1f41b6805 100644 --- a/packages/devtools_app/lib/src/app.dart +++ b/packages/devtools_app/lib/src/app.dart @@ -104,7 +104,7 @@ class DevToolsAppState extends State with AutoDisposeMixin { void initState() { super.initState(); - ga.setupDimensions(); + unawaited(ga.setupDimensions()); addAutoDisposeListener(serviceManager.isolateManager.mainIsolate, () { setState(() { diff --git a/packages/devtools_app/lib/src/charts/flame_chart.dart b/packages/devtools_app/lib/src/charts/flame_chart.dart index a22efc31f3a..be7d4df3a55 100644 --- a/packages/devtools_app/lib/src/charts/flame_chart.dart +++ b/packages/devtools_app/lib/src/charts/flame_chart.dart @@ -392,22 +392,30 @@ abstract class FlameChartState !connectionState.userInitiatedConnectionState) { // Try to reconnect (otherwise, will fall back to showing the // disconnected overlay). - _attemptUrlConnection(); + unawaited(_attemptUrlConnection()); } }); @@ -88,7 +88,7 @@ class _InitializerState extends State serviceManager.onConnectionAvailable.listen((_) => setState(() {})), ); - _attemptUrlConnection(); + unawaited(_attemptUrlConnection()); } @override @@ -97,7 +97,7 @@ class _InitializerState extends State // Handle widget rebuild when the URL has changed. if (widget.url != null && widget.url != oldWidget.url) { - _attemptUrlConnection(); + unawaited(_attemptUrlConnection()); } } diff --git a/packages/devtools_app/lib/src/framework/landing_screen.dart b/packages/devtools_app/lib/src/framework/landing_screen.dart index fb1803310db..42e5bd27e45 100644 --- a/packages/devtools_app/lib/src/framework/landing_screen.dart +++ b/packages/devtools_app/lib/src/framework/landing_screen.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. +import 'dart:async'; + import 'package:devtools_shared/devtools_shared.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -158,7 +160,8 @@ class _ConnectDialogState extends State SizedBox( width: scaleByFontFactor(350.0), child: TextField( - onSubmitted: actionInProgress ? null : (str) => _connect(), + onSubmitted: + actionInProgress ? null : (str) => unawaited(_connect()), autofocus: true, decoration: const InputDecoration( isDense: true, @@ -265,7 +268,7 @@ class ImportFileInstructions extends StatelessWidget { ), const SizedBox(height: defaultSpacing), ElevatedButton( - onPressed: () => _importFile(context), + onPressed: () => unawaited(_importFile(context)), child: const MaterialIconLabel( label: 'Import File', iconData: Icons.file_upload, diff --git a/packages/devtools_app/lib/src/framework/release_notes/release_notes.dart b/packages/devtools_app/lib/src/framework/release_notes/release_notes.dart index d5eddabd486..0b0c200295e 100644 --- a/packages/devtools_app/lib/src/framework/release_notes/release_notes.dart +++ b/packages/devtools_app/lib/src/framework/release_notes/release_notes.dart @@ -166,7 +166,8 @@ class ReleaseNotes extends AnimatedWidget { : Expanded( child: Markdown( data: markdownData!, - onTapLink: (_, href, __) => launchUrl(href!, context), + onTapLink: (_, href, __) => + unawaited(launchUrl(href!, context)), ), ), ], diff --git a/packages/devtools_app/lib/src/http/http_request_data.dart b/packages/devtools_app/lib/src/http/http_request_data.dart index ece2405eee1..2110df43d6f 100644 --- a/packages/devtools_app/lib/src/http/http_request_data.dart +++ b/packages/devtools_app/lib/src/http/http_request_data.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; import 'dart:convert'; import 'dart:typed_data'; @@ -44,7 +45,7 @@ class DartIOHttpRequestData extends NetworkRequest { }) : wrapperId = _dartIoHttpRequestWrapperId++, super(timelineMicrosBase) { if (requestFullDataFromVmService && _request.isResponseComplete) { - getFullRequestData(); + unawaited(getFullRequestData()); } } diff --git a/packages/devtools_app/lib/src/primitives/auto_dispose.dart b/packages/devtools_app/lib/src/primitives/auto_dispose.dart index 1bd594e636b..ed6451295de 100644 --- a/packages/devtools_app/lib/src/primitives/auto_dispose.dart +++ b/packages/devtools_app/lib/src/primitives/auto_dispose.dart @@ -60,7 +60,7 @@ class Disposer { /// It is fine to call this method and then add additional subscriptions. void cancelStreamSubscriptions() { for (StreamSubscription subscription in _subscriptions) { - subscription.cancel(); + unawaited(subscription.cancel()); } _subscriptions.clear(); } diff --git a/packages/devtools_app/lib/src/primitives/message_bus.dart b/packages/devtools_app/lib/src/primitives/message_bus.dart index eab48a1ec02..923d94eb974 100644 --- a/packages/devtools_app/lib/src/primitives/message_bus.dart +++ b/packages/devtools_app/lib/src/primitives/message_bus.dart @@ -44,6 +44,6 @@ class MessageBus { /// testing context. All stream listeners will be closed and the bus will not /// fire any more events. void close() { - _controller.close(); + unawaited(_controller.close()); } } diff --git a/packages/devtools_app/lib/src/primitives/utils.dart b/packages/devtools_app/lib/src/primitives/utils.dart index 1e2aced15ac..c8ab7e6edbf 100644 --- a/packages/devtools_app/lib/src/primitives/utils.dart +++ b/packages/devtools_app/lib/src/primitives/utils.dart @@ -315,9 +315,9 @@ Stream combineStreams(Stream a, Stream b, Stream c) { csub = c.listen(controller.add); }, onCancel: () { - asub?.cancel(); - bsub?.cancel(); - csub?.cancel(); + unawaited(asub?.cancel()); + unawaited(bsub?.cancel()); + unawaited(csub?.cancel()); }, ); @@ -484,11 +484,13 @@ class RateLimiter { // request. The existing request has already started so may return state // that is now out of date. requestScheduledButNotStarted = true; - _pendingRequest!.future.whenComplete(() { - _pendingRequest = null; - requestScheduledButNotStarted = false; - scheduleRequest(); - }); + unawaited( + _pendingRequest!.future.whenComplete(() { + _pendingRequest = null; + requestScheduledButNotStarted = false; + scheduleRequest(); + }), + ); return; } 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 e3c6e3af33b..4901e8072f7 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 @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:devtools_shared/devtools_shared.dart'; import 'package:flutter/material.dart'; @@ -164,7 +166,7 @@ class _AppSizeBodyState extends State super.didChangeDependencies(); if (!initController()) return; - maybeLoadAppSizeFiles(); + unawaited(maybeLoadAppSizeFiles()); addAutoDisposeListener(controller.activeDiffTreeType); } 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 184432530a1..d8c3c3f464f 100644 --- a/packages/devtools_app/lib/src/screens/debugger/breakpoint_manager.dart +++ b/packages/devtools_app/lib/src/screens/debugger/breakpoint_manager.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. +import 'dart:async'; + import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:vm_service/vm_service.dart'; @@ -238,15 +240,16 @@ class BreakpointManager extends Disposer { final breakpoint = event.breakpoint!; _breakpoints.value = [..._breakpoints.value, breakpoint]; - // ignore: unawaited_futures - breakpointManager.createBreakpointWithLocation(breakpoint).then((bp) { - final list = [ - ..._breakpointsWithLocation.value, - bp, - ]..sort(); + unawaited( + breakpointManager.createBreakpointWithLocation(breakpoint).then((bp) { + final list = [ + ..._breakpointsWithLocation.value, + bp, + ]..sort(); - _breakpointsWithLocation.value = list; - }); + _breakpointsWithLocation.value = list; + }), + ); break; case EventKind.kBreakpointResolved: @@ -257,16 +260,17 @@ class BreakpointManager extends Disposer { breakpoint ]; - // ignore: unawaited_futures - breakpointManager.createBreakpointWithLocation(breakpoint).then((bp) { - final list = _breakpointsWithLocation.value.toList(); - // Remote the bp with the older, unresolved information from the list. - list.removeWhere((breakpoint) => bp.breakpoint.id == bp.id); - // Add the bp with the newer, resolved information. - list.add(bp); - list.sort(); - _breakpointsWithLocation.value = list; - }); + unawaited( + breakpointManager.createBreakpointWithLocation(breakpoint).then((bp) { + final list = _breakpointsWithLocation.value.toList(); + // Remote the bp with the older, unresolved information from the list. + list.removeWhere((breakpoint) => bp.breakpoint.id == bp.id); + // Add the bp with the newer, resolved information. + list.add(bp); + list.sort(); + _breakpointsWithLocation.value = list; + }), + ); break; 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 e02a175b55c..bef19171dca 100644 --- a/packages/devtools_app/lib/src/screens/debugger/call_stack.dart +++ b/packages/devtools_app/lib/src/screens/debugger/call_stack.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. +import 'dart:async'; + import 'package:flutter/material.dart' hide Stack; import 'package:vm_service/vm_service.dart'; @@ -101,7 +103,7 @@ class _CallStackState extends State final result = Material( color: selected ? theme.colorScheme.selectedRowColor : null, child: InkWell( - onTap: () => _onStackFrameSelected(frame), + onTap: () => unawaited(_onStackFrameSelected(frame)), child: Container( padding: const EdgeInsets.symmetric(horizontal: densePadding), alignment: Alignment.centerLeft, diff --git a/packages/devtools_app/lib/src/screens/debugger/codeview.dart b/packages/devtools_app/lib/src/screens/debugger/codeview.dart index e2211131239..8e2c6bc65d8 100644 --- a/packages/devtools_app/lib/src/screens/debugger/codeview.dart +++ b/packages/devtools_app/lib/src/screens/debugger/codeview.dart @@ -180,10 +180,12 @@ class _CodeViewState extends State if (_lastScriptRef?.uri != scriptRef?.uri) { // Default to scrolling to the top of the script. if (animate) { - verticalController.animateTo( - 0, - duration: longDuration, - curve: defaultCurve, + unawaited( + verticalController.animateTo( + 0, + duration: longDuration, + curve: defaultCurve, + ), ); } else { verticalController.jumpTo(0); @@ -204,10 +206,12 @@ class _CodeViewState extends State final scrollPosition = lineIndex * CodeView.rowHeight - ((extent - CodeView.rowHeight) / 2); if (animate) { - verticalController.animateTo( - scrollPosition, - duration: longDuration, - curve: defaultCurve, + unawaited( + verticalController.animateTo( + scrollPosition, + duration: longDuration, + curve: defaultCurve, + ), ); } else { verticalController.jumpTo(scrollPosition); @@ -727,10 +731,12 @@ class _LinesState extends State with AutoDisposeMixin { activeSearchLine * CodeView.rowHeight - widget.height / 2, 0.0, ); - widget.scrollController.animateTo( - targetOffset, - duration: defaultDuration, - curve: defaultCurve, + unawaited( + widget.scrollController.animateTo( + targetOffset, + duration: defaultDuration, + curve: defaultCurve, + ), ); } } @@ -1190,9 +1196,11 @@ Future fetchScriptLocationFullFilePath( } void showGoToLineDialog(BuildContext context, CodeViewController controller) { - showDialog( - context: context, - builder: (context) => GoToLineDialog(controller), + unawaited( + showDialog( + context: context, + builder: (context) => GoToLineDialog(controller), + ), ); } 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 35c7d64cbf3..fb3c7917798 100644 --- a/packages/devtools_app/lib/src/screens/debugger/codeview_controller.dart +++ b/packages/devtools_app/lib/src/screens/debugger/codeview_controller.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. +import 'dart:async'; + import 'package:flutter/foundation.dart'; import 'package:vm_service/vm_service.dart'; @@ -133,7 +135,7 @@ class CodeViewController extends DisposableController log('Trying to show a location with a null script ref', LogLevel.error); } - _parseCurrentScript(); + unawaited(_parseCurrentScript()); // We want to notify regardless of the previous scriptLocation, temporarily // set to null to ensure that happens. diff --git a/packages/devtools_app/lib/src/screens/debugger/controls.dart b/packages/devtools_app/lib/src/screens/debugger/controls.dart index a94ea25b073..55aa68a52ab 100644 --- a/packages/devtools_app/lib/src/screens/debugger/controls.dart +++ b/packages/devtools_app/lib/src/screens/debugger/controls.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. +import 'dart:async'; + import 'package:codicon/codicon.dart'; import 'package:flutter/material.dart' hide Stack; import 'package:vm_service/vm_service.dart'; @@ -157,7 +159,7 @@ class BreakOnExceptionsControl extends StatelessWidget { onChanged: controller.isSystemIsolate ? null : (ExceptionMode? mode) { - controller.setIsolatePauseMode(mode!.id); + unawaited(controller.setIsolatePauseMode(mode!.id)); }, isDense: true, items: [ 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 5ed0cd737cc..ad764f9869c 100644 --- a/packages/devtools_app/lib/src/screens/debugger/debugger_controller.dart +++ b/packages/devtools_app/lib/src/screens/debugger/debugger_controller.dart @@ -60,7 +60,7 @@ class DebuggerController extends DisposableController _clearCaches(); _hasTruncatedFrames.value = false; - _getStackOperation?.cancel(); + unawaited(_getStackOperation?.cancel()); _getStackOperation = null; isolateRef = null; @@ -377,7 +377,7 @@ class DebuggerController extends DisposableController if (_resuming.value && event.isolate!.id != _isolateRefId && event.kind == EventKind.kPauseStart) { - _resumeIsolatePauseStart(event); + unawaited(_resumeIsolatePauseStart(event)); } if (event.isolate!.id != _isolateRefId) return; @@ -386,7 +386,7 @@ class DebuggerController extends DisposableController switch (event.kind) { case EventKind.kResume: - _pause(false); + unawaited(_pause(false)); break; case EventKind.kPauseStart: case EventKind.kPauseExit: @@ -397,7 +397,7 @@ class DebuggerController extends DisposableController // Any event we receive here indicates that any resume/step request has been // processed. _resuming.value = false; - _pause(true, pauseEvent: event); + unawaited(_pause(true, pauseEvent: event)); break; } } @@ -457,9 +457,11 @@ class DebuggerController extends DisposableController /// This method ensures that the source for the script is populated in our /// cache, in order to reduce flashing in the editor view. void _populateScriptAndShowLocation(ScriptRef scriptRef) { - scriptManager.getScript(scriptRef).then((script) { - codeViewController.showScriptLocation(ScriptLocation(scriptRef)); - }); + unawaited( + scriptManager.getScript(scriptRef).then((script) { + codeViewController.showScriptLocation(ScriptLocation(scriptRef)); + }), + ); } final _hasTruncatedFrames = ValueNotifier(false); 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 f76ba78e8be..53e4d8fc7a3 100644 --- a/packages/devtools_app/lib/src/screens/debugger/debugger_screen.dart +++ b/packages/devtools_app/lib/src/screens/debugger/debugger_screen.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. +import 'dart:async'; + import 'package:codicon/codicon.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart' hide Stack; @@ -116,7 +118,7 @@ class DebuggerScreenBodyState extends State void didChangeDependencies() { super.didChangeDependencies(); if (!initController()) return; - controller.onFirstDebuggerScreenLoad(); + unawaited(controller.onFirstDebuggerScreenLoad()); } @override @@ -166,9 +168,11 @@ class DebuggerScreenBodyState extends State DebuggerScreen.id, analytics_constants.pageReady, ); - serviceManager.sendDwdsEvent( - screen: DebuggerScreen.id, - action: analytics_constants.pageReady, + unawaited( + serviceManager.sendDwdsEvent( + screen: DebuggerScreen.id, + action: analytics_constants.pageReady, + ), ); _shownFirstScript = true; } 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 809aa7435ac..5e616f39e6d 100644 --- a/packages/devtools_app/lib/src/screens/debugger/program_explorer.dart +++ b/packages/devtools_app/lib/src/screens/debugger/program_explorer.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. +import 'dart:async'; + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:vm_service/vm_service.dart' hide Stack; @@ -349,7 +351,7 @@ class _FileExplorerState extends State<_FileExplorer> with AutoDisposeMixin { return _ProgramExplorerRow( node: node, onTap: () { - widget.controller.selectNode(node); + unawaited(widget.controller.selectNode(node)); onTap(); }, ); @@ -366,10 +368,12 @@ class _FileExplorerState extends State<_FileExplorer> with AutoDisposeMixin { _scrollController.offset + _scrollController.position.extentInside, ); if (!extentVisible.contains(selectedNodeOffset)) { - _scrollController.animateTo( - selectedNodeOffset - _selectedNodeTopSpacing, - duration: longDuration, - curve: defaultCurve, + unawaited( + _scrollController.animateTo( + selectedNodeOffset - _selectedNodeTopSpacing, + duration: longDuration, + curve: defaultCurve, + ), ); } } diff --git a/packages/devtools_app/lib/src/screens/debugger/variables.dart b/packages/devtools_app/lib/src/screens/debugger/variables.dart index 10e1fa4304f..3cef92c5927 100644 --- a/packages/devtools_app/lib/src/screens/debugger/variables.dart +++ b/packages/devtools_app/lib/src/screens/debugger/variables.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. +import 'dart:async'; + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart' hide Stack; import 'package:provider/provider.dart'; @@ -220,7 +222,8 @@ class VariableSelectionControls extends MaterialTextSelectionControls { clipboardStatus: clipboardStatus!, handleCut: canCut(delegate) ? () => handleCut(delegate) : null, handleCopy: canCopy(delegate) ? () => handleCopy(delegate) : null, - handlePaste: canPaste(delegate) ? () => handlePaste(delegate) : null, + handlePaste: + canPaste(delegate) ? () => unawaited(handlePaste(delegate)) : null, handleSelectAll: canSelectAll(delegate) ? () => handleSelectAll(delegate) : null, handleInspect: 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 e35bd8c9217..3f268de7b74 100644 --- a/packages/devtools_app/lib/src/screens/inspector/inspector_controller.dart +++ b/packages/devtools_app/lib/src/screens/inspector/inspector_controller.dart @@ -48,7 +48,7 @@ class InspectorController extends DisposableController this.parent, this.isSummaryTree = true, }) : assert((detailsTree != null) == isSummaryTree) { - _init(detailsTree: detailsTree); + unawaited(_init(detailsTree: detailsTree)); } Future _init({ @@ -263,7 +263,7 @@ class InspectorController extends DisposableController if (visibleToUser) { if (parent == null) { - maybeLoadUI(); + unawaited(maybeLoadUI()); } } else { shutdownTree(false); @@ -396,7 +396,7 @@ class InspectorController extends DisposableController isActive = true; inspectorService.addClient(this); - maybeLoadUI(); + unawaited(maybeLoadUI()); } InspectorService get inspectorService => @@ -514,7 +514,7 @@ class InspectorController extends DisposableController // Clear now to eliminate frame of highlighted nodes flicker. _clearValueToInspectorTreeNodeMapping(); - _recomputeTreeRoot(selection, null, false); + unawaited(_recomputeTreeRoot(selection, null, false)); } InspectorTreeNode? getSubtreeRootNode() { @@ -594,7 +594,7 @@ class InspectorController extends DisposableController if (!treeLoadStarted) { treeLoadStarted = true; // This was the first frame. - maybeLoadUI(); + unawaited(maybeLoadUI()); } _refreshRateLimiter.scheduleRequest(); } @@ -619,7 +619,7 @@ class InspectorController extends DisposableController // Wait for the master to update. return; } - updateSelectionFromService(firstFrame: false); + unawaited(updateSelectionFromService(firstFrame: false)); } Future updateSelectionFromService({ @@ -699,7 +699,9 @@ class InspectorController extends DisposableController if (nodeInTree == null) { // The tree has probably changed since we last updated. Do a full refresh // so that the tree includes the new node we care about. - _recomputeTreeRoot(newSelection, detailsSelection, setSubtreeRoot); + unawaited( + _recomputeTreeRoot(newSelection, detailsSelection, setSubtreeRoot), + ); } refreshSelection(newSelection, detailsSelection, setSubtreeRoot); @@ -775,14 +777,16 @@ class InspectorController extends DisposableController .erroredItemsForPage(InspectorScreen.id) .value; - updateSelectionFromService( - firstFrame: false, - inspectorRef: errors.keys.elementAt(index), + unawaited( + updateSelectionFromService( + firstFrame: false, + inspectorRef: errors.keys.elementAt(index), + ), ); } void _onExpand(InspectorTreeNode node) { - inspectorTree.maybePopulateChildren(node); + unawaited(inspectorTree.maybePopulateChildren(node)); } Future _addNodeToConsole(InspectorTreeNode node) async { @@ -809,7 +813,7 @@ class InspectorController extends DisposableController final InspectorTreeNode? node = inspectorTree.selection; if (node != null) { - inspectorTree.maybePopulateChildren(node); + unawaited(inspectorTree.maybePopulateChildren(node)); } if (programaticSelectionChangeInProgress) { return; @@ -880,7 +884,7 @@ class InspectorController extends DisposableController if (toSelect != null) { final diagnosticToSelect = toSelect.diagnostic!; - diagnosticToSelect.setSelectionInspector(true); + unawaited(diagnosticToSelect.setSelectionInspector(true)); } } } @@ -889,7 +893,7 @@ class InspectorController extends DisposableController _showDetailSubtrees(selection, detailsSelection); } else if (selection != null) { // We can't rely on the details tree to update the selection on the server in this case. - selection.setSelectionInspector(true); + unawaited(selection.setSelectionInspector(true)); } } diff --git a/packages/devtools_app/lib/src/screens/inspector/inspector_screen.dart b/packages/devtools_app/lib/src/screens/inspector/inspector_screen.dart index 6471c4c4df0..0d0efbf34ed 100644 --- a/packages/devtools_app/lib/src/screens/inspector/inspector_screen.dart +++ b/packages/devtools_app/lib/src/screens/inspector/inspector_screen.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; import 'dart:collection'; import 'package:flutter/material.dart'; @@ -296,9 +297,11 @@ class InspectorScreenBodyState extends State SettingsOutlinedButton( tooltip: 'Flutter Inspector Settings', onPressed: () { - showDialog( - context: context, - builder: (context) => FlutterInspectorSettingsDialog(), + unawaited( + showDialog( + context: context, + builder: (context) => FlutterInspectorSettingsDialog(), + ), ); }, ), @@ -309,25 +312,27 @@ class InspectorScreenBodyState extends State void _refreshInspector() { ga.select(analytics_constants.inspector, analytics_constants.refresh); - blockWhileInProgress(() async { - // If the user is force refreshing the inspector before the first load has - // completed, this could indicate a slow load time or that the inspector - // failed to load the tree once available. - if (!controller.firstInspectorTreeLoadCompleted) { - // We do not want to complete this timing operation because the force - // refresh will skew the results. - ga.cancelTimingOperation( - InspectorScreen.id, - analytics_constants.pageReady, - ); - ga.select( - analytics_constants.inspector, - analytics_constants.refreshEmptyTree, - ); - controller.firstInspectorTreeLoadCompleted = true; - } - await controller.onForceRefresh(); - }); + unawaited( + blockWhileInProgress(() async { + // If the user is force refreshing the inspector before the first load has + // completed, this could indicate a slow load time or that the inspector + // failed to load the tree once available. + if (!controller.firstInspectorTreeLoadCompleted) { + // We do not want to complete this timing operation because the force + // refresh will skew the results. + ga.cancelTimingOperation( + InspectorScreen.id, + analytics_constants.pageReady, + ); + ga.select( + analytics_constants.inspector, + analytics_constants.refreshEmptyTree, + ); + controller.firstInspectorTreeLoadCompleted = true; + } + await controller.onForceRefresh(); + }), + ); } } @@ -547,11 +552,11 @@ class PubRootDirectorySection extends StatelessWidget { isRefreshing: preferences.inspector.isRefreshingCustomPubRootDirectories, onEntryAdded: (p0) => - preferences.inspector.addPubRootDirectories([p0]), + unawaited(preferences.inspector.addPubRootDirectories([p0])), onEntryRemoved: (p0) => - preferences.inspector.removePubRootDirectories([p0]), + unawaited(preferences.inspector.removePubRootDirectories([p0])), onRefreshTriggered: () => - preferences.inspector.loadCustomPubRootDirectories(), + unawaited(preferences.inspector.loadCustomPubRootDirectories()), ), ); }, diff --git a/packages/devtools_app/lib/src/screens/inspector/inspector_screen_details_tab.dart b/packages/devtools_app/lib/src/screens/inspector/inspector_screen_details_tab.dart index 237b56ad6fa..e7cf3e14377 100644 --- a/packages/devtools_app/lib/src/screens/inspector/inspector_screen_details_tab.dart +++ b/packages/devtools_app/lib/src/screens/inspector/inspector_screen_details_tab.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. +import 'dart:async'; + import 'package:flutter/material.dart'; import '../../analytics/analytics.dart' as ga; @@ -111,16 +113,23 @@ class _InspectorExpandCollapseButtonsState } void _onExpandClick() { - blockWhileInProgress(() async { - ga.select(analytics_constants.inspector, analytics_constants.expandAll); - await widget.controller.expandAllNodesInDetailsTree(); - }); + unawaited( + blockWhileInProgress(() async { + ga.select(analytics_constants.inspector, analytics_constants.expandAll); + await widget.controller.expandAllNodesInDetailsTree(); + }), + ); } void _onCollapseClick() { - blockWhileInProgress(() async { - ga.select(analytics_constants.inspector, analytics_constants.collapseAll); - await widget.controller.collapseDetailsToSelected(); - }); + unawaited( + blockWhileInProgress(() async { + ga.select( + analytics_constants.inspector, + analytics_constants.collapseAll, + ); + await widget.controller.collapseDetailsToSelected(); + }), + ); } } diff --git a/packages/devtools_app/lib/src/screens/inspector/inspector_service.dart b/packages/devtools_app/lib/src/screens/inspector/inspector_service.dart index d67b13294d5..f1545b9bfd9 100644 --- a/packages/devtools_app/lib/src/screens/inspector/inspector_service.dart +++ b/packages/devtools_app/lib/src/screens/inspector/inspector_service.dart @@ -1548,14 +1548,14 @@ class InspectorObjectGroupManager { void clearCurrent() { if (_current != null) { - _current!.dispose(); + unawaited(_current!.dispose()); _current = null; } } void cancelNext() { if (_next != null) { - _next!.dispose(); + unawaited(_next!.dispose()); _setNextNull(); } } 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 0a5f01b6d0e..66d7b02dfa5 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 @@ -991,9 +991,11 @@ class _InspectorTreeState extends State if (!controller.firstInspectorTreeLoadCompleted && widget.isSummaryTree) { ga.timeEnd(InspectorScreen.id, analytics_constants.pageReady); - serviceManager.sendDwdsEvent( - screen: InspectorScreen.id, - action: analytics_constants.pageReady, + unawaited( + serviceManager.sendDwdsEvent( + screen: InspectorScreen.id, + action: analytics_constants.pageReady, + ), ); controller.firstInspectorTreeLoadCompleted = true; } 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 a314753f324..58921740238 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 @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; import 'dart:math' as math; import 'package:flutter/material.dart'; @@ -408,7 +409,7 @@ class BoxChildVisualizer extends StatelessWidget { top: renderOffset.dy, left: renderOffset.dx, child: InkWell( - onTap: () => state.onTap(propertiesLocal), + onTap: () => unawaited(state.onTap(propertiesLocal)), onDoubleTap: () => state.onDoubleTap(propertiesLocal), onLongPress: () => state.onDoubleTap(propertiesLocal), child: SizedBox( 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 bd03fa5540e..6a989520755 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 @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; import 'dart:math' as math; import 'package:flutter/foundation.dart'; @@ -272,7 +273,7 @@ class _FlexLayoutExplorerWidgetState extends LayoutExplorerWidgetState< left: crossAxisArrowIndicatorSize + margin, ), child: InkWell( - onTap: () => onTap(propertiesLocal), + onTap: () => unawaited(onTap(propertiesLocal)), child: WidgetVisualizer( title: flexType, layoutProperties: propertiesLocal, @@ -421,10 +422,12 @@ class _VisualizeFlexChildrenState extends State { selectedChildKey.currentContext?.findRenderObject(); if (selectedRenderObject != null && widget.scrollController.hasClients) { - widget.scrollController.position.ensureVisible( - selectedRenderObject, - alignment: 0.5, - duration: defaultDuration, + unawaited( + widget.scrollController.position.ensureVisible( + selectedRenderObject, + alignment: 0.5, + duration: defaultDuration, + ), ); } }); @@ -739,7 +742,7 @@ class FlexChildVisualizer extends StatelessWidget { top: renderOffset.dy, left: renderOffset.dx, child: GestureDetector( - onTap: () => state.onTap(propertiesLocal), + onTap: () => unawaited(state.onTap(propertiesLocal)), onDoubleTap: () => state.onDoubleTap(propertiesLocal), onLongPress: () => state.onDoubleTap(propertiesLocal), child: SizedBox( diff --git a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/layout_explorer_widget.dart b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/layout_explorer_widget.dart index e7e6aa643e5..3e9f5de4edc 100644 --- a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/layout_explorer_widget.dart +++ b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/layout_explorer_widget.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. +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; @@ -265,7 +267,7 @@ abstract class LayoutExplorerWidgetState void initState() { super.initState(); scrollController = ScrollController(); - _computeLogDetails(); + unawaited(_computeLogDetails()); } @override void didUpdateWidget(LogDetails oldWidget) { super.didUpdateWidget(oldWidget); if (widget.log != oldWidget.log) { - _computeLogDetails(); + unawaited(_computeLogDetails()); } } 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 a7b30302ea4..fc73c5748f4 100644 --- a/packages/devtools_app/lib/src/screens/logging/logging_controller.dart +++ b/packages/devtools_app/lib/src/screens/logging/logging_controller.dart @@ -93,7 +93,7 @@ class LoggingDetailsController { tree = createLoggingTree( onSelectionChange: () { final InspectorTreeNode node = tree!.selection!; - tree!.maybePopulateChildren(node); + unawaited(tree!.maybePopulateChildren(node)); // TODO(jacobr): node.diagnostic.isDiagnosticableValue isn't quite // right. @@ -102,7 +102,7 @@ class LoggingDetailsController { // TODO(jacobr): warn if the selection can't be set as the node is // stale which is likely if this is an old log entry. onShowInspector(); - diagnosticLocal.setSelectionInspector(false); + unawaited(diagnosticLocal.setSelectionInspector(false)); } }, ); @@ -125,13 +125,15 @@ class LoggingDetailsController { if (data.needsComputing) { onShowDetails(text: ''); - data.compute().then((_) { - // If we're still displaying the same log entry, then update the UI with - // the calculated value. - if (this.data == data) { - _updateUIFromData(); - } - }); + unawaited( + data.compute().then((_) { + // If we're still displaying the same log entry, then update the UI with + // the calculated value. + if (this.data == data) { + _updateUIFromData(); + } + }), + ); } else { _updateUIFromData(); } 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 75de6b4d92e..464b84fc9f6 100644 --- a/packages/devtools_app/lib/src/screens/logging/logging_screen.dart +++ b/packages/devtools_app/lib/src/screens/logging/logging_screen.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. +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -168,12 +170,14 @@ class _LoggingScreenState extends State } void _showFilterDialog() { - showDialog( - context: context, - builder: (context) => FilterDialog( - controller: controller, - queryInstructions: LoggingScreenBody.filterQueryInstructions, - queryFilterArguments: controller.filterArgs, + unawaited( + showDialog( + context: context, + builder: (context) => FilterDialog( + controller: controller, + queryInstructions: LoggingScreenBody.filterQueryInstructions, + queryFilterArguments: controller.filterArgs, + ), ), ); } diff --git a/packages/devtools_app/lib/src/screens/logging/vm_service_logger.dart b/packages/devtools_app/lib/src/screens/logging/vm_service_logger.dart index 4a6a4faed55..81c5e3f1b47 100644 --- a/packages/devtools_app/lib/src/screens/logging/vm_service_logger.dart +++ b/packages/devtools_app/lib/src/screens/logging/vm_service_logger.dart @@ -78,7 +78,7 @@ class VmServiceTrafficLogger { } void dispose() { - _sendSub.cancel(); - _receiveSub.cancel(); + unawaited(_sendSub.cancel()); + unawaited(_receiveSub.cancel()); } } diff --git a/packages/devtools_app/lib/src/screens/memory/memory_controller.dart b/packages/devtools_app/lib/src/screens/memory/memory_controller.dart index 45f8d9020da..7b4543b2f1d 100644 --- a/packages/devtools_app/lib/src/screens/memory/memory_controller.dart +++ b/packages/devtools_app/lib/src/screens/memory/memory_controller.dart @@ -1003,8 +1003,8 @@ class MemoryController extends DisposableController super.dispose(); _displayIntervalNotifier.dispose(); _memorySourceNotifier.dispose(); - _disconnectController.close(); - _memoryTrackerController.close(); + unawaited(_disconnectController.close()); + unawaited(_memoryTrackerController.close()); _memoryTracker?.dispose(); } } diff --git a/packages/devtools_app/lib/src/screens/memory/memory_heap_tree_view.dart b/packages/devtools_app/lib/src/screens/memory/memory_heap_tree_view.dart index de2eda54e2a..803cd85b778 100644 --- a/packages/devtools_app/lib/src/screens/memory/memory_heap_tree_view.dart +++ b/packages/devtools_app/lib/src/screens/memory/memory_heap_tree_view.dart @@ -613,7 +613,7 @@ class _HeapTreeViewState extends State controller.selectedLeaf = null; controller.groupingBy.value = newValue!; if (controller.snapshots.isNotEmpty) { - doGroupBy(); + unawaited(doGroupBy()); } }, ); @@ -955,10 +955,12 @@ class _HeapTreeViewState extends State // dialog same as cancel. // Dialog isn't dismissed by clicking outside the dialog (modal). // Pressing either the Apply or Cancel button will dismiss. - showDialog( - context: context, - builder: (BuildContext context) => SnapshotFilterDialog(controller), - barrierDismissible: false, + unawaited( + showDialog( + context: context, + builder: (BuildContext context) => SnapshotFilterDialog(controller), + barrierDismissible: false, + ), ); } diff --git a/packages/devtools_app/lib/src/screens/memory/memory_protocol.dart b/packages/devtools_app/lib/src/screens/memory/memory_protocol.dart index 06d1ccfacea..13fcdc8628b 100644 --- a/packages/devtools_app/lib/src/screens/memory/memory_protocol.dart +++ b/packages/devtools_app/lib/src/screens/memory/memory_protocol.dart @@ -64,7 +64,7 @@ class MemoryTracker { memoryController.paused.removeListener(_updateLiveDataPolling); _pollingTimer?.cancel(); - _gcStreamListener?.cancel(); + unawaited(_gcStreamListener?.cancel()); _pollingTimer = null; _gcStreamListener = null; } diff --git a/packages/devtools_app/lib/src/screens/memory/panes/allocation_profile/allocation_profile_table_view_controller.dart b/packages/devtools_app/lib/src/screens/memory/panes/allocation_profile/allocation_profile_table_view_controller.dart index 1f699275d3b..25cefcb81e0 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/allocation_profile/allocation_profile_table_view_controller.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/allocation_profile/allocation_profile_table_view_controller.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. +import 'dart:async'; + import 'package:flutter/foundation.dart'; import 'package:vm_service/vm_service.dart'; @@ -34,14 +36,14 @@ class AllocationProfileTableViewController extends DisposableController autoDisposeStreamSubscription( serviceManager.service!.onGCEvent.listen((event) { if (refreshOnGc.value) { - refresh(); + unawaited(refresh()); } }), ); addAutoDisposeListener(serviceManager.isolateManager.selectedIsolate, () { - refresh(); + unawaited(refresh()); }); - refresh(); + unawaited(refresh()); _initialized = true; } diff --git a/packages/devtools_app/lib/src/screens/memory/panes/allocation_tracing/allocation_profile_tracing_view.dart b/packages/devtools_app/lib/src/screens/memory/panes/allocation_tracing/allocation_profile_tracing_view.dart index fbea133be29..bd4776289b1 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/allocation_tracing/allocation_profile_tracing_view.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/allocation_tracing/allocation_profile_tracing_view.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. +import 'dart:async'; + import 'package:flutter/material.dart'; import '../../../../analytics/constants.dart' as analytics_constants; @@ -29,7 +31,8 @@ class AllocationProfileTracingViewState @override void initState() { super.initState(); - controller = AllocationProfileTracingViewController()..initialize(); + controller = AllocationProfileTracingViewController(); + unawaited(controller.initialize()); } @override diff --git a/packages/devtools_app/lib/src/screens/memory/panes/control/secondary_controls.dart b/packages/devtools_app/lib/src/screens/memory/panes/control/secondary_controls.dart index a6218a52fe9..a54fc0d82f0 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/control/secondary_controls.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/control/secondary_controls.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. +import 'dart:async'; + import 'package:flutter/material.dart'; import '../../../../analytics/analytics.dart' as ga; @@ -61,9 +63,11 @@ class SecondaryControls extends StatelessWidget { } void _openSettingsDialog(BuildContext context) { - showDialog( - context: context, - builder: (context) => MemorySettingsDialog(controller), + unawaited( + showDialog( + context: context, + builder: (context) => MemorySettingsDialog(controller), + ), ); } 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 3c1661c03b5..72a7efe08f9 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 @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:flutter/material.dart'; import '../../../../../shared/common_widgets.dart'; @@ -42,11 +44,13 @@ class SnapshotControlPane extends StatelessWidget { ValueListenableBuilder( valueListenable: filter, builder: (context, filterValue, ___) => FilterButton( - onPressed: () => showDialog( - context: context, - builder: (context) => ClassFilterDialog( - filterValue, - onChanged: controller.applyFilter, + onPressed: () => unawaited( + showDialog( + context: context, + builder: (context) => ClassFilterDialog( + filterValue, + onChanged: controller.applyFilter, + ), ), ), isFilterActive: !filter.value.isEmpty, diff --git a/packages/devtools_app/lib/src/screens/memory/panes/leaks/leaks_pane.dart b/packages/devtools_app/lib/src/screens/memory/panes/leaks/leaks_pane.dart index ee0fb2cd113..82cd522dc8d 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/leaks/leaks_pane.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/leaks/leaks_pane.dart @@ -67,8 +67,8 @@ class _LeaksPaneController { } void dispose() { - summarySubscription.cancel(); - detailsSubscription.cancel(); + unawaited(summarySubscription.cancel()); + unawaited(detailsSubscription.cancel()); status.dispose(); } 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 0fa6b30b8e0..db88dfc7e50 100644 --- a/packages/devtools_app/lib/src/screens/network/network_controller.dart +++ b/packages/devtools_app/lib/src/screens/network/network_controller.dart @@ -87,14 +87,15 @@ class NetworkController if (!request.inProgress) { final data = outstandingRequestsMap.remove(id) as DartIOHttpRequestData; - data.getFullRequestData().then((value) => _updateData()); + + unawaited(data.getFullRequestData().then((value) => _updateData())); } continue; } else if (wrapped.inProgress) { outstandingRequestsMap.putIfAbsent(id, () => wrapped); } else { // If the response has completed, send a request for body data. - wrapped.getFullRequestData().then((value) => _updateData()); + unawaited(wrapped.getFullRequestData().then((value) => _updateData())); } currentValues.add(wrapped); } @@ -162,7 +163,7 @@ class NetworkController // TODO(kenz): look into improving performance by caching more data. // Polling less frequently helps performance. const Duration(milliseconds: 2000), - (_) => _networkService.refreshNetworkData(), + (_) => unawaited(_networkService.refreshNetworkData()), ); } else { _pollingTimer?.cancel(); 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 e0689f98692..dae999381a3 100644 --- a/packages/devtools_app/lib/src/screens/network/network_screen.dart +++ b/packages/devtools_app/lib/src/screens/network/network_screen.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. +import 'dart:async'; + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -125,13 +127,13 @@ class _NetworkScreenBodyState extends State void didChangeDependencies() { super.didChangeDependencies(); if (!initController()) return; - controller.startRecording(); + unawaited(controller.startRecording()); cancelListeners(); addAutoDisposeListener(serviceManager.isolateManager.mainIsolate, () { if (serviceManager.isolateManager.mainIsolate.value != null) { - controller.startRecording(); + unawaited(controller.startRecording()); } }); } @@ -250,7 +252,7 @@ class _NetworkProfilerControlsState extends State<_NetworkProfilerControls> analytics_constants.network, analytics_constants.clear, ); - widget.controller.clear(); + unawaited(widget.controller.clear()); }, ), const SizedBox(width: defaultSpacing), @@ -277,12 +279,14 @@ class _NetworkProfilerControlsState extends State<_NetworkProfilerControls> } void _showFilterDialog() { - showDialog( - context: context, - builder: (context) => FilterDialog( - controller: widget.controller, - queryInstructions: NetworkScreenBody.filterQueryInstructions, - queryFilterArguments: widget.controller.filterArgs, + unawaited( + showDialog( + context: context, + builder: (context) => FilterDialog( + controller: widget.controller, + queryInstructions: NetworkScreenBody.filterQueryInstructions, + queryFilterArguments: widget.controller.filterArgs, + ), ), ); } @@ -441,20 +445,24 @@ class ActionsColumn extends ColumnData PopupMenuItem( child: const Text('Copy as URL'), onTap: () { - copyToClipboard( - data.uri, - 'Copied the URL to the clipboard', - context, + unawaited( + copyToClipboard( + data.uri, + 'Copied the URL to the clipboard', + context, + ), ); }, ), PopupMenuItem( child: const Text('Copy as cURL'), onTap: () { - copyToClipboard( - CurlCommand.from(data).toString(), - 'Copied the cURL command to the clipboard', - context, + unawaited( + copyToClipboard( + CurlCommand.from(data).toString(), + 'Copied the cURL command to the clipboard', + context, + ), ); }, ) diff --git a/packages/devtools_app/lib/src/screens/performance/flutter_frames_chart.dart b/packages/devtools_app/lib/src/screens/performance/flutter_frames_chart.dart index c490d4cd13a..7dd6468fb0b 100644 --- a/packages/devtools_app/lib/src/screens/performance/flutter_frames_chart.dart +++ b/packages/devtools_app/lib/src/screens/performance/flutter_frames_chart.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; import 'dart:math' as math; import 'package:flutter/material.dart'; @@ -99,7 +100,7 @@ class _FlutterFramesChartState extends State super.didUpdateWidget(oldWidget); if (_framesScrollController.hasClients && _framesScrollController.atScrollBottom) { - _framesScrollController.autoScrollToBottom(); + unawaited(_framesScrollController.autoScrollToBottom()); } if (!collectionEquals(oldWidget.frames, widget.frames)) { @@ -471,7 +472,7 @@ class FlutterFramesChartItem extends StatelessWidget { ), ); } - controller.toggleSelectedFrame(frame); + unawaited(controller.toggleSelectedFrame(frame)); } } 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 7cdeb501123..dcec02adb07 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 @@ -148,21 +148,24 @@ class _TrackWidgetBuildsSettingState extends State // respond to their state changes. for (final type in TrackWidgetBuildsScope.values) { final extension = _trackWidgetBuildsExtensions[type]!; - serviceManager.serviceExtensionManager - .waitForServiceExtensionAvailable(extension.extension) - .then((isServiceAvailable) { - if (isServiceAvailable) { - _trackingAvailable.value = true; - final state = serviceManager.serviceExtensionManager - .getServiceExtensionState(extension.extension); + unawaited( + serviceManager.serviceExtensionManager + .waitForServiceExtensionAvailable(extension.extension) + .then((isServiceAvailable) { + if (isServiceAvailable) { + _trackingAvailable.value = true; + + final state = serviceManager.serviceExtensionManager + .getServiceExtensionState(extension.extension); - _updateForServiceExtensionState(state.value, type); - addAutoDisposeListener(state, () { _updateForServiceExtensionState(state.value, type); - }); - } - }); + addAutoDisposeListener(state, () { + _updateForServiceExtensionState(state.value, type); + }); + } + }), + ); } } 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 383d0e3a317..02da7e0f824 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 @@ -64,7 +64,7 @@ class EnhanceTracingController extends DisposableController @override void dispose() { - showMenuStreamController.close(); + unawaited(showMenuStreamController.close()); super.dispose(); } } diff --git a/packages/devtools_app/lib/src/screens/performance/panes/controls/performance_settings.dart b/packages/devtools_app/lib/src/screens/performance/panes/controls/performance_settings.dart index a403dadfc77..0ff3fca8824 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/controls/performance_settings.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/controls/performance_settings.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. +import 'dart:async'; + import 'package:flutter/material.dart'; import '../../../../primitives/feature_flags.dart'; @@ -80,7 +82,7 @@ class TimelineStreamSettings extends StatelessWidget { description: 'Http traffic', notifier: controller.httpTimelineLoggingEnabled as ValueNotifier, onChanged: (value) => - controller.toggleHttpRequestLogging(value ?? false), + unawaited(controller.toggleHttpRequestLogging(value ?? false)), ), ]; } @@ -110,10 +112,11 @@ class TimelineStreamSettings extends StatelessWidget { title: stream.name, description: stream.description, notifier: stream.recorded as ValueNotifier, - onChanged: (newValue) => - serviceManager.timelineStreamManager.updateTimelineStream( - stream, - newValue ?? false, + onChanged: (newValue) => unawaited( + serviceManager.timelineStreamManager.updateTimelineStream( + stream, + newValue ?? false, + ), ), ), ) diff --git a/packages/devtools_app/lib/src/screens/performance/panes/raster_stats/raster_stats.dart b/packages/devtools_app/lib/src/screens/performance/panes/raster_stats/raster_stats.dart index d4c0c3464d3..5ad02b4fd03 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/raster_stats/raster_stats.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/raster_stats/raster_stats.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; import 'dart:math' as math; import 'package:flutter/material.dart'; @@ -289,11 +290,13 @@ class _FullScreenButton extends StatelessWidget { size: defaultButtonHeight, ), onPressed: () { - showDialog( - context: context, - builder: (context) => LayerImageDialog( - snapshot: snapshot, - originalFrameSize: originalFrameSize, + unawaited( + showDialog( + context: context, + builder: (context) => LayerImageDialog( + snapshot: snapshot, + originalFrameSize: originalFrameSize, + ), ), ); }, 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 b6e1405abb4..01362767aab 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 @@ -89,7 +89,7 @@ class PerfettoController extends DisposableController html.window.addEventListener('message', _handleMessage); if (isExternalBuild) { - _loadInitialStyle(); + unawaited(_loadInitialStyle()); addAutoDisposeListener(preferences.darkModeTheme, () async { _loadStyle(preferences.darkModeTheme.value); }); diff --git a/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/timeline_flame_chart.dart b/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/timeline_flame_chart.dart index 153827bfc21..52a07e27706 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/timeline_flame_chart.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/timeline_flame_chart.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; import 'dart:math' as math; import 'package:collection/collection.dart'; @@ -645,8 +646,8 @@ class TimelineFlameChartState backgroundColor: backgroundWithOpacity, threadButtonContainerWidth: threadButtonContainerWidth, onPressed: () => isNext - ? _viewNextEventInGroup(group) - : _viewPreviousEventInGroup(group), + ? unawaited(_viewNextEventInGroup(group)) + : unawaited(_viewPreviousEventInGroup(group)), shouldEnableButton: (g) => isNext ? _shouldEnableNextInThreadButton(g) : _shouldEnablePrevInThreadButton(g), 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 0406dcacd92..1f3db1ec300 100644 --- a/packages/devtools_app/lib/src/screens/performance/performance_controller.dart +++ b/packages/devtools_app/lib/src/screens/performance/performance_controller.dart @@ -61,7 +61,9 @@ class PerformanceController extends DisposableController with SearchControllerMixin, AutoDisposeControllerMixin { PerformanceController() { processor = TimelineEventProcessor(this); - _init(); + // See https://github.com/dart-lang/linter/issues/3801 + // ignore: discarded_futures + unawaited(_init()); } final cpuProfilerController = @@ -313,7 +315,9 @@ class PerformanceController extends DisposableController if (event.extensionKind == 'Flutter.Frame' && _firstLiveFrameId == null) { _firstLiveFrameId = FlutterFrame.parse(event.extensionData!.data).id; - _firstFrameEventSubscription!.cancel(); + // See https://github.com/dart-lang/linter/issues/3801 + // ignore: discarded_futures + unawaited(_firstFrameEventSubscription!.cancel()); _firstFrameEventSubscription = null; } }, @@ -950,6 +954,8 @@ class PerformanceController extends DisposableController void toggleUseLegacyTraceViewer(bool? value) { useLegacyTraceViewer.value = value ?? false; + // `unawaited` does not work for FutureOr + // ignore: discarded_futures processAvailableEvents(); } @@ -993,7 +999,9 @@ class PerformanceController extends DisposableController perfettoController.dispose(); } enhanceTracingController.dispose(); - _firstFrameEventSubscription?.cancel(); + // See https://github.com/dart-lang/linter/issues/3801 + // ignore: discarded_futures + unawaited(_firstFrameEventSubscription?.cancel()); super.dispose(); } } 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 ab7701cba10..1b2883045a1 100644 --- a/packages/devtools_app/lib/src/screens/performance/performance_screen.dart +++ b/packages/devtools_app/lib/src/screens/performance/performance_screen.dart @@ -127,7 +127,7 @@ class PerformanceScreenBodyState extends State }); final offlinePerformanceData = OfflinePerformanceData.parse(timelineJson); if (!offlinePerformanceData.isEmpty) { - loadOfflineData(offlinePerformanceData); + unawaited(loadOfflineData(offlinePerformanceData)); } } } @@ -318,9 +318,11 @@ class SecondaryPerformanceControls extends StatelessWidget { } void _openSettingsDialog(BuildContext context) { - showDialog( - context: context, - builder: (context) => PerformanceSettingsDialog(controller), + unawaited( + showDialog( + context: context, + builder: (context) => PerformanceSettingsDialog(controller), + ), ); } } 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 2013072966b..b159f7877f7 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 @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:flutter/material.dart'; import '../../analytics/analytics.dart' as ga; @@ -146,7 +148,7 @@ class _TabbedPerformanceViewState extends State PerformanceScreen.id, analytics_constants.collectRasterStats, ); - controller.collectRasterStats(); + unawaited(controller.collectRasterStats()); }, ), const SizedBox(width: denseSpacing), diff --git a/packages/devtools_app/lib/src/screens/profiler/cpu_profile_controller.dart b/packages/devtools_app/lib/src/screens/profiler/cpu_profile_controller.dart index 745a705a6f0..ea3a1bf9635 100644 --- a/packages/devtools_app/lib/src/screens/profiler/cpu_profile_controller.dart +++ b/packages/devtools_app/lib/src/screens/profiler/cpu_profile_controller.dart @@ -562,12 +562,14 @@ class CpuProfilerController label: dataLabel, ); } - processAndSetData( - filteredData, - processId: 'filter $_filterIdentifier', - storeAsUserTagNone: false, - shouldApplyFilters: false, - shouldRefreshSearchMatches: true, + unawaited( + processAndSetData( + filteredData, + processId: 'filter $_filterIdentifier', + storeAsUserTagNone: false, + shouldApplyFilters: false, + shouldRefreshSearchMatches: true, + ), ); _filterIdentifier++; } 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 aef06939726..74ad76c2e9a 100644 --- a/packages/devtools_app/lib/src/screens/profiler/cpu_profiler.dart +++ b/packages/devtools_app/lib/src/screens/profiler/cpu_profiler.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; import 'dart:developer'; import 'package:flutter/material.dart'; @@ -268,10 +269,12 @@ class _CpuProfilerState extends State } void _showFilterDialog() { - showDialog( - context: context, - builder: (context) => CpuProfileFilterDialog( - controller: widget.controller, + unawaited( + showDialog( + context: context, + builder: (context) => CpuProfileFilterDialog( + controller: widget.controller, + ), ), ); } 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 f2e0e75e5b2..ddbfa75d623 100644 --- a/packages/devtools_app/lib/src/screens/profiler/profiler_screen.dart +++ b/packages/devtools_app/lib/src/screens/profiler/profiler_screen.dart @@ -122,7 +122,7 @@ class _ProfilerScreenBodyState extends State ); final offlineProfilerData = CpuProfileData.parse(profilerJson); if (!offlineProfilerData.isEmpty) { - loadOfflineData(offlineProfilerData); + unawaited(loadOfflineData(offlineProfilerData)); } } } @@ -310,7 +310,7 @@ class _PrimaryControls extends StatelessWidget { analytics_constants.cpuProfiler, analytics_constants.record, ); - controller.startRecording(); + unawaited(controller.startRecording()); }, ), const SizedBox(width: denseSpacing), @@ -323,7 +323,7 @@ class _PrimaryControls extends StatelessWidget { analytics_constants.cpuProfiler, analytics_constants.stop, ); - controller.stopRecording(); + unawaited(controller.stopRecording()); }, ), const SizedBox(width: denseSpacing), @@ -337,7 +337,7 @@ class _PrimaryControls extends StatelessWidget { analytics_constants.cpuProfiler, analytics_constants.clear, ); - controller.clear(); + unawaited(controller.clear()); }, ), ], @@ -379,7 +379,9 @@ class _SecondaryControls extends StatelessWidget { analytics_constants.cpuProfiler, analytics_constants.profileAppStartUp, ); - controller.cpuProfilerController.loadAppStartUpProfile(); + unawaited( + controller.cpuProfilerController.loadAppStartUpProfile(), + ); } : null, ), @@ -395,7 +397,7 @@ class _SecondaryControls extends StatelessWidget { analytics_constants.cpuProfiler, analytics_constants.loadAllCpuSamples, ); - controller.cpuProfilerController.loadAllSamples(); + unawaited(controller.cpuProfilerController.loadAllSamples()); } : null, ), 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 e08b6a6cdce..421f068f67f 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 @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:flutter/foundation.dart'; import 'package:vm_service/vm_service.dart'; @@ -21,9 +23,11 @@ class ProfilerScreenController extends DisposableController with AutoDisposeControllerMixin { ProfilerScreenController() { if (!offlineController.offlineMode.value) { - allowedError( - serviceManager.service!.setProfilePeriod(mediumProfilePeriod), - logError: false, + unawaited( + allowedError( + serviceManager.service!.setProfilePeriod(mediumProfilePeriod), + logError: false, + ), ); _currentIsolate = serviceManager.isolateManager.selectedIsolate.value; diff --git a/packages/devtools_app/lib/src/screens/provider/provider_screen.dart b/packages/devtools_app/lib/src/screens/provider/provider_screen.dart index 0a859e173b6..3afb84debc0 100644 --- a/packages/devtools_app/lib/src/screens/provider/provider_screen.dart +++ b/packages/devtools_app/lib/src/screens/provider/provider_screen.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. +import 'dart:async'; + import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -124,9 +126,11 @@ class ProviderScreenBody extends ConsumerWidget { actions: [ SettingsOutlinedButton( onPressed: () { - showDialog( - context: context, - builder: (_) => _StateInspectorSettingsDialog(), + unawaited( + showDialog( + context: context, + builder: (_) => _StateInspectorSettingsDialog(), + ), ); }, ), diff --git a/packages/devtools_app/lib/src/screens/vm_developer/isolate_statistics/isolate_statistics_view_controller.dart b/packages/devtools_app/lib/src/screens/vm_developer/isolate_statistics/isolate_statistics_view_controller.dart index 8bf68aed47a..d45c90cee81 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/isolate_statistics/isolate_statistics_view_controller.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/isolate_statistics/isolate_statistics_view_controller.dart @@ -20,19 +20,19 @@ class IsolateStatisticsViewController extends DisposableController // If the CPU profiler is enabled later, refresh the isolate data to get // the tag information. cpuProfilerController.profilerFlagNotifier?.addListener( - () => refresh(), + () => unawaited(refresh()), ); final isolateListenable = serviceManager.isolateManager.selectedIsolate; addAutoDisposeListener(isolateListenable, () { final isolate = isolateListenable.value; if (isolate != null) { - switchToIsolate(isolate); + unawaited(switchToIsolate(isolate)); } }); final isolate = isolateListenable.value; if (isolate != null) { - switchToIsolate(isolate); + unawaited(switchToIsolate(isolate)); } } 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 327c6f8f76b..65c17980915 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 @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -94,7 +96,7 @@ class _ObjectInspectorViewState extends State<_ObjectInspectorView> final location = node.location; if (objRef != null && objRef != controller.objectHistory.current.value?.ref) { - controller.pushObject(objRef, scriptRef: location?.scriptRef); + unawaited(controller.pushObject(objRef, scriptRef: location?.scriptRef)); } } } 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 070747975b7..4303eace7ad 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 @@ -778,13 +778,13 @@ class VmObjectDisplayBasicLayout extends StatelessWidget { void _onExpandRetainingPath(bool expanded) { if (object.retainingPath.value == null) { - object.requestRetainingPath(); + unawaited(object.requestRetainingPath()); } } void _onExpandInboundRefs(bool expanded) { if (object.inboundReferences.value == null) { - object.requestInboundsRefs(); + unawaited(object.requestInboundsRefs()); } } } 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 eeab6249521..0ee0372d0ef 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 @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:vm_service/vm_service.dart' hide VmService; @@ -12,7 +14,7 @@ import '../../../shared/globals.dart'; class VMStatisticsViewController extends DisposableController { VMStatisticsViewController() { - refresh(); + unawaited(refresh()); } Future refresh() async { diff --git a/packages/devtools_app/lib/src/service/service.dart b/packages/devtools_app/lib/src/service/service.dart index 3126732e79a..829612d777d 100644 --- a/packages/devtools_app/lib/src/service/service.dart +++ b/packages/devtools_app/lib/src/service/service.dart @@ -126,6 +126,6 @@ Stream convertBroadcastToSingleSubscriber(Stream stream) { late StreamSubscription subscription; controller.onListen = () => subscription = stream.listen((T e) => controller.add(e)); - controller.onCancel = () => subscription.cancel(); + controller.onCancel = () => unawaited(subscription.cancel()); return controller.stream; } 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 a914f8e3311..6af1082c76c 100644 --- a/packages/devtools_app/lib/src/service/service_extension_widgets.dart +++ b/packages/devtools_app/lib/src/service/service_extension_widgets.dart @@ -163,12 +163,14 @@ class _ServiceExtensionButtonGroupState final wasSelected = extensionState.isSelected; - serviceManager.serviceExtensionManager.setServiceExtensionState( - extensionState.description.extension, - enabled: !wasSelected, - value: wasSelected - ? extensionState.description.disabledValue - : extensionState.description.enabledValue, + unawaited( + serviceManager.serviceExtensionManager.setServiceExtensionState( + extensionState.description.extension, + enabled: !wasSelected, + value: wasSelected + ? extensionState.description.disabledValue + : extensionState.description.enabledValue, + ), ); }); } else { @@ -190,7 +192,11 @@ class HotReloadButton extends StatelessWidget { child: _RegisteredServiceExtensionButton._( serviceDescription: hotReload, action: () { + // The future is returned. + // ignore: discarded_futures return serviceManager.runDeviceBusyTask( + // The future is returned. + // ignore: discarded_futures _wrapReloadCall('reload', serviceManager.performHotReload), ); }, @@ -212,7 +218,11 @@ class HotRestartButton extends StatelessWidget { child: _RegisteredServiceExtensionButton._( serviceDescription: hotRestart, action: () { + // The future is returned. + // ignore: discarded_futures return serviceManager.runDeviceBusyTask( + // The future is returned. + // ignore: discarded_futures _wrapReloadCall('restart', serviceManager.performHotRestart), ); }, @@ -292,14 +302,16 @@ class _RegisteredServiceExtensionButtonState if (_hidden) return const SizedBox(); return InkWell( - onTap: () => 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, @@ -400,14 +412,17 @@ class _ServiceExtensionToggleState extends State<_ServiceExtensionToggle> value = !value; }); - invokeAndCatchErrors(() async { - await serviceManager.serviceExtensionManager.setServiceExtensionState( - widget.service.extension, - enabled: value, - value: - value ? widget.service.enabledValue : widget.service.disabledValue, - ); - }); + unawaited( + invokeAndCatchErrors(() async { + await serviceManager.serviceExtensionManager.setServiceExtensionState( + widget.service.extension, + enabled: value, + value: value + ? widget.service.enabledValue + : widget.service.disabledValue, + ); + }), + ); } } @@ -461,19 +476,21 @@ class _ServiceExtensionCheckboxState extends State _setValueFromState(state.value); } - serviceManager.serviceExtensionManager - .waitForServiceExtensionAvailable(widget.serviceExtension.extension) - .then((isServiceAvailable) { - if (isServiceAvailable) { - extensionAvailable.value = true; - final state = serviceManager.serviceExtensionManager - .getServiceExtensionState(widget.serviceExtension.extension); - _setValueFromState(state.value); - addAutoDisposeListener(state, () { + unawaited( + serviceManager.serviceExtensionManager + .waitForServiceExtensionAvailable(widget.serviceExtension.extension) + .then((isServiceAvailable) { + if (isServiceAvailable) { + extensionAvailable.value = true; + final state = serviceManager.serviceExtensionManager + .getServiceExtensionState(widget.serviceExtension.extension); _setValueFromState(state.value); - }); - } - }); + addAutoDisposeListener(state, () { + _setValueFromState(state.value); + }); + } + }), + ); } void _setValueFromState(ServiceExtensionState state) { @@ -516,17 +533,19 @@ class _ServiceExtensionCheckboxState extends State } void _onChanged(bool? value) { - invokeAndCatchErrors(() async { - var enabled = value == true; - if (widget.serviceExtension.inverted) enabled = !enabled; - await serviceManager.serviceExtensionManager.setServiceExtensionState( - widget.serviceExtension.extension, - enabled: enabled, - value: enabled - ? widget.serviceExtension.enabledValue - : widget.serviceExtension.disabledValue, - ); - }); + unawaited( + invokeAndCatchErrors(() async { + var enabled = value == true; + if (widget.serviceExtension.inverted) enabled = !enabled; + await serviceManager.serviceExtensionManager.setServiceExtensionState( + widget.serviceExtension.extension, + enabled: enabled, + value: enabled + ? widget.serviceExtension.enabledValue + : widget.serviceExtension.disabledValue, + ); + }), + ); } } 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 f45405b5535..4cdb03e100d 100644 --- a/packages/devtools_app/lib/src/service/vm_service_wrapper.dart +++ b/packages/devtools_app/lib/src/service/vm_service_wrapper.dart @@ -20,7 +20,7 @@ class VmServiceWrapper implements VmService { this._connectedUri, { this.trackFutures = false, }) { - _initSupportedProtocols(); + unawaited(_initSupportedProtocols()); } VmServiceWrapper.fromNewVmService( @@ -37,7 +37,7 @@ class VmServiceWrapper implements VmService { log: log, disposeHandler: disposeHandler, ); - _initSupportedProtocols(); + unawaited(_initSupportedProtocols()); } // TODO(https://github.com/dart-lang/sdk/issues/49072): in the long term, do diff --git a/packages/devtools_app/lib/src/shared/common_widgets.dart b/packages/devtools_app/lib/src/shared/common_widgets.dart index f99b936d773..24b86e2b233 100644 --- a/packages/devtools_app/lib/src/shared/common_widgets.dart +++ b/packages/devtools_app/lib/src/shared/common_widgets.dart @@ -1774,6 +1774,8 @@ class _JsonViewerState extends State isSystemIsolate: true, ), ); + // Intended to be unawaited. + // ignore: discarded_futures _initializeTree = buildVariablesTree(variable); } @@ -1864,7 +1866,7 @@ class MoreInfoLink extends StatelessWidget { } void _onLinkTap(BuildContext context) { - launchUrl(url, context); + unawaited(launchUrl(url, context)); ga.select(gaScreenName, gaSelectedItemDescription); } } @@ -2004,7 +2006,9 @@ class CopyToClipboardControl extends StatelessWidget { Widget build(BuildContext context) { final onPressed = dataProvider == null ? null - : () => copyToClipboard(dataProvider!() ?? '', successMessage, context); + : () => unawaited( + copyToClipboard(dataProvider!() ?? '', successMessage, context), + ); return ToolbarAction( icon: Icons.content_copy, @@ -2423,15 +2427,17 @@ class HelpButtonWithDialog extends StatelessWidget { return HelpButton( onPressed: () { ga.select(gaScreen, gaSelection); - showDialog( - context: context, - builder: (context) => DevToolsDialog( - title: DialogTitleText(dialogTitle), - includeDivider: false, - content: child, - actions: const [ - DialogCloseButton(), - ], + unawaited( + showDialog( + context: context, + builder: (context) => DevToolsDialog( + title: DialogTitleText(dialogTitle), + includeDivider: false, + content: child, + actions: const [ + DialogCloseButton(), + ], + ), ), ); }, diff --git a/packages/devtools_app/lib/src/shared/console.dart b/packages/devtools_app/lib/src/shared/console.dart index 2866d88ecf9..b0c6e5fa923 100644 --- a/packages/devtools_app/lib/src/shared/console.dart +++ b/packages/devtools_app/lib/src/shared/console.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. +import 'dart:async'; + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -208,7 +210,7 @@ class _ConsoleOutputState extends State<_ConsoleOutput> _scrollToBottom = false; WidgetsBinding.instance.addPostFrameCallback((timeStamp) { if (_scroll.hasClients) { - _scroll.autoScrollToBottom(); + unawaited(_scroll.autoScrollToBottom()); } else { // Set back to true to retry scrolling when we are back in view. // We expected to be in view after the frame but it turns out we were diff --git a/packages/devtools_app/lib/src/shared/console_service.dart b/packages/devtools_app/lib/src/shared/console_service.dart index 4773873f3de..319c7b53500 100644 --- a/packages/devtools_app/lib/src/shared/console_service.dart +++ b/packages/devtools_app/lib/src/shared/console_service.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. +import 'dart:async'; + import 'package:flutter/foundation.dart'; import 'package:vm_service/vm_service.dart'; @@ -106,7 +108,7 @@ class ConsoleService extends Disposer { if (_objectGroup?.inspectorService == inspectorService) { return _objectGroup!; } - _objectGroup?.dispose(); + unawaited(_objectGroup?.dispose()); _objectGroup = inspectorService.createObjectGroup('console'); return _objectGroup!; } diff --git a/packages/devtools_app/lib/src/shared/editable_list.dart b/packages/devtools_app/lib/src/shared/editable_list.dart index 07a38d5688a..389eefc461a 100644 --- a/packages/devtools_app/lib/src/shared/editable_list.dart +++ b/packages/devtools_app/lib/src/shared/editable_list.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. +import 'dart:async'; + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -274,7 +276,7 @@ class EditableListCopyDirectoryButton extends StatelessWidget { key: key, padding: EdgeInsets.zero, onPressed: () { - copyToClipboard(value, 'Copied to clipboard.', context); + unawaited(copyToClipboard(value, 'Copied to clipboard.', context)); }, iconSize: defaultIconSize, splashRadius: defaultIconSize, diff --git a/packages/devtools_app/lib/src/shared/error_badge_manager.dart b/packages/devtools_app/lib/src/shared/error_badge_manager.dart index 89fae011224..80ac0e97284 100644 --- a/packages/devtools_app/lib/src/shared/error_badge_manager.dart +++ b/packages/devtools_app/lib/src/shared/error_badge_manager.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; import 'dart:collection'; import 'package:collection/collection.dart' show IterableExtension; @@ -36,10 +37,12 @@ class ErrorBadgeManager extends DisposableController void vmServiceOpened(VmServiceWrapper service) { // Ensure structured errors are enabled. - serviceManager.serviceExtensionManager.setServiceExtensionState( - extensions.structuredErrors.extension, - enabled: true, - value: true, + unawaited( + serviceManager.serviceExtensionManager.setServiceExtensionState( + extensions.structuredErrors.extension, + enabled: true, + value: true, + ), ); // Log Flutter extension events. diff --git a/packages/devtools_app/lib/src/shared/eval_on_dart_library.dart b/packages/devtools_app/lib/src/shared/eval_on_dart_library.dart index 4a85ff15d44..0ddc440aa7b 100644 --- a/packages/devtools_app/lib/src/shared/eval_on_dart_library.dart +++ b/packages/devtools_app/lib/src/shared/eval_on_dart_library.dart @@ -52,7 +52,7 @@ class EvalOnDartLibrary extends DisposableController } if (isolateRef != null) { - _initialize(isolateRef, _currentRequestId); + unawaited(_initialize(isolateRef, _currentRequestId)); } } diff --git a/packages/devtools_app/lib/src/shared/preferences.dart b/packages/devtools_app/lib/src/shared/preferences.dart index b5fab1e8fee..4b40a61edef 100644 --- a/packages/devtools_app/lib/src/shared/preferences.dart +++ b/packages/devtools_app/lib/src/shared/preferences.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; import 'dart:convert'; import 'package:flutter/foundation.dart'; @@ -196,9 +197,11 @@ class InspectorPreferencesController extends DisposableController } void _persistCustomPubRootDirectoriesToStorage() { - storage.setValue( - _customPubRootStorageId(), - jsonEncode(_customPubRootDirectories.value), + unawaited( + storage.setValue( + _customPubRootStorageId(), + jsonEncode(_customPubRootDirectories.value), + ), ); } diff --git a/packages/devtools_app/lib/src/shared/server_api_client.dart b/packages/devtools_app/lib/src/shared/server_api_client.dart index 283fcb15943..6ac73bab06e 100644 --- a/packages/devtools_app/lib/src/shared/server_api_client.dart +++ b/packages/devtools_app/lib/src/shared/server_api_client.dart @@ -163,10 +163,10 @@ class DevToolsServerConnection { frameworkController.notifyShowPageId(pageId); return; case 'enableNotifications': - Notification.requestPermission(); + unawaited(Notification.requestPermission()); return; case 'notify': - notify(); + unawaited(notify()); return; case 'ping': ping(); @@ -182,21 +182,23 @@ class DevToolsServerConnection { } void _notifyConnected(Uri vmServiceUri) { - _callMethod('connected', {'uri': vmServiceUri.toString()}); + unawaited(_callMethod('connected', {'uri': vmServiceUri.toString()})); } void _notifyCurrentPage(PageChangeEvent page) { - _callMethod( - 'currentPage', - { - 'id': page.id, - 'embedded': page.embedded, - }, + unawaited( + _callMethod( + 'currentPage', + { + 'id': page.id, + 'embedded': page.embedded, + }, + ), ); } void _notifyDisconnected() { - _callMethod('disconnected'); + unawaited(_callMethod('disconnected')); } /// Retrieves a preference value from the DevTools configuration file at @@ -219,6 +221,6 @@ class DevToolsServerConnection { /// Allows the server to ping the client to see that it is definitely still /// active and doesn't just appear to be connected because of SSE timeouts. void ping() { - _callMethod('pingResponse'); + unawaited(_callMethod('pingResponse')); } } diff --git a/packages/devtools_app/lib/src/shared/table/table.dart b/packages/devtools_app/lib/src/shared/table/table.dart index 81e5b6c2a22..af49c4c572d 100644 --- a/packages/devtools_app/lib/src/shared/table/table.dart +++ b/packages/devtools_app/lib/src/shared/table/table.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; import 'dart:math'; import 'package:flutter/foundation.dart'; @@ -727,16 +728,21 @@ class TreeTableState> extends State> // Scroll so selected row is the last full item displayed in the viewport. // To do this we need to be showing the (minCompleteItemsInView + 1) // previous item at the top. - scrollController.animateTo( - (newSelectedNodeIndex - minCompleteItemsInView + 1) * defaultRowHeight, - duration: defaultDuration, - curve: defaultCurve, + unawaited( + scrollController.animateTo( + (newSelectedNodeIndex - minCompleteItemsInView + 1) * + defaultRowHeight, + duration: defaultDuration, + curve: defaultCurve, + ), ); } else if (isAboveViewport) { - scrollController.animateTo( - newSelectedNodeIndex * defaultRowHeight, - duration: defaultDuration, - curve: defaultCurve, + unawaited( + scrollController.animateTo( + newSelectedNodeIndex * defaultRowHeight, + duration: defaultDuration, + curve: defaultCurve, + ), ); } @@ -936,7 +942,7 @@ class _TableState extends State<_Table> with AutoDisposeMixin { // If we're at the end already, scroll to expose the new content. if (widget.autoScrollContent) { if (scrollController.hasClients && scrollController.atScrollBottom) { - scrollController.autoScrollToBottom(); + unawaited(scrollController.autoScrollToBottom()); } } diff --git a/packages/devtools_app/lib/src/ui/hover.dart b/packages/devtools_app/lib/src/ui/hover.dart index 2e40833966a..1d3bbea8eb7 100644 --- a/packages/devtools_app/lib/src/ui/hover.dart +++ b/packages/devtools_app/lib/src/ui/hover.dart @@ -501,9 +501,11 @@ class _HoverCardTooltipState extends State { Future hoverCardDataFuture, ) { final completer = Completer(); - hoverCardDataFuture.then( - (data) => completer.complete(data), - onError: (_) => completer.complete(null), + unawaited( + hoverCardDataFuture.then( + (data) => completer.complete(data), + onError: (_) => completer.complete(null), + ), ); return completer; } diff --git a/packages/devtools_app/lib/src/ui/search.dart b/packages/devtools_app/lib/src/ui/search.dart index ab366203e89..8ee484ce4c3 100644 --- a/packages/devtools_app/lib/src/ui/search.dart +++ b/packages/devtools_app/lib/src/ui/search.dart @@ -197,7 +197,7 @@ mixin SearchControllerMixin { } void disposeSearch() { - _searchOperation?.cancel(); + unawaited(_searchOperation?.cancel()); if (_searchDebounce?.isActive ?? false) { _searchDebounce!.cancel(); } diff --git a/packages/devtools_app/lib/src/ui/utils.dart b/packages/devtools_app/lib/src/ui/utils.dart index 5c8af1a6e9a..4bf3ebc1719 100644 --- a/packages/devtools_app/lib/src/ui/utils.dart +++ b/packages/devtools_app/lib/src/ui/utils.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be found // in the LICENSE file. +import 'dart:async'; import 'dart:math'; import 'package:flutter/material.dart'; @@ -193,11 +194,13 @@ void maybeScrollToPosition( if (!extentVisible.contains(position)) { final positionToScrollTo = max(0.0, position - defaultRowHeight); - scrollController.animateTo( - //TODO (carolynqu): should be positionToScrollTo.clamp(0.0, scrollController.position.maxScrollExtent) but maxScrollExtent is not being updated, https://github.com/flutter/devtools/issues/4264 - positionToScrollTo, - duration: defaultDuration, - curve: defaultCurve, + unawaited( + scrollController.animateTo( + //TODO (carolynqu): should be positionToScrollTo.clamp(0.0, scrollController.position.maxScrollExtent) but maxScrollExtent is not being updated, https://github.com/flutter/devtools/issues/4264 + positionToScrollTo, + duration: defaultDuration, + curve: defaultCurve, + ), ); } } diff --git a/packages/devtools_app/lib/src/ui/vm_flag_widgets.dart b/packages/devtools_app/lib/src/ui/vm_flag_widgets.dart index 0229101c3ff..148cda2d122 100644 --- a/packages/devtools_app/lib/src/ui/vm_flag_widgets.dart +++ b/packages/devtools_app/lib/src/ui/vm_flag_widgets.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. +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:vm_service/vm_service.dart'; @@ -46,7 +48,7 @@ class ProfileGranularityDropdown extends StatelessWidget { .value; // Set the vm flag value to the [safeValue] if we get to this state. if (safeValue != flag.valueAsString) { - _onProfileGranularityChanged(safeValue); + unawaited(_onProfileGranularityChanged(safeValue)); } final bannerMessageController = diff --git a/packages/devtools_app/test/debugger/program_explorer_test.dart b/packages/devtools_app/test/debugger/program_explorer_test.dart index f1a1aadc0c9..77476918cf5 100644 --- a/packages/devtools_app/test/debugger/program_explorer_test.dart +++ b/packages/devtools_app/test/debugger/program_explorer_test.dart @@ -78,6 +78,8 @@ void main() { when(fakeServiceManager.connectedApp!.isDartWebAppNow).thenReturn(false); final mockScriptManager = MockScriptManager(); + //`then` is used + // ignore: discarded_futures when(mockScriptManager.getScript(any)).thenAnswer( (_) => Future