From 36c5e321a5dc66a9147d556e04ec4cb6264398bc Mon Sep 17 00:00:00 2001 From: xster Date: Tue, 5 Feb 2019 15:00:51 -0800 Subject: [PATCH] Print 50000$ monopoly money (#27531) --- .../lib/src/android/android_workflow.dart | 2 +- .../flutter_tools/lib/src/base/common.dart | 11 +++++ .../flutter_tools/lib/src/base/process.dart | 3 +- .../lib/src/commands/analyze_once.dart | 4 +- .../lib/src/commands/daemon.dart | 27 ++++++------ .../flutter_tools/lib/src/commands/run.dart | 4 +- .../flutter_tools/lib/src/dart/analysis.dart | 3 +- packages/flutter_tools/lib/src/devfs.dart | 3 +- .../lib/src/fuchsia/fuchsia_device.dart | 4 +- .../lib/src/ios/code_signing.dart | 2 +- packages/flutter_tools/lib/src/ios/mac.dart | 2 +- .../flutter_tools/lib/src/ios/simulators.dart | 4 +- .../lib/src/resident_runner.dart | 5 ++- packages/flutter_tools/lib/src/run_hot.dart | 44 +++++++++++-------- .../lib/src/test/flutter_platform.dart | 12 ++--- .../lib/src/tester/flutter_tester.dart | 2 +- packages/flutter_tools/test/compile_test.dart | 41 ++++++++++------- .../test/integration/hot_reload_test.dart | 5 ++- .../test/integration/test_driver.dart | 5 ++- .../flutter_tools/tool/daemon_client.dart | 7 +-- 20 files changed, 113 insertions(+), 77 deletions(-) diff --git a/packages/flutter_tools/lib/src/android/android_workflow.dart b/packages/flutter_tools/lib/src/android/android_workflow.dart index 2ac566f163f..d7376fbad44 100644 --- a/packages/flutter_tools/lib/src/android/android_workflow.dart +++ b/packages/flutter_tools/lib/src/android/android_workflow.dart @@ -294,7 +294,7 @@ class AndroidLicenseValidator extends DoctorValidator { // The real stdin will never finish streaming. Pipe until the child process // finishes. - process.stdin.addStream(stdin); // ignore: unawaited_futures + unawaited(process.stdin.addStream(stdin)); // Wait for stdout and stderr to be fully processed, because process.exitCode // may complete first. await waitGroup(>[ diff --git a/packages/flutter_tools/lib/src/base/common.dart b/packages/flutter_tools/lib/src/base/common.dart index 3130576d798..501f889a72d 100644 --- a/packages/flutter_tools/lib/src/base/common.dart +++ b/packages/flutter_tools/lib/src/base/common.dart @@ -39,3 +39,14 @@ class ToolExit implements Exception { @override String toString() => 'Exception: $message'; } + +/// Indicates to the linter that the given future is intentionally not `await`-ed. +/// +/// Has the same functionality as `unawaited` from `package:pedantic`. +/// +/// In an async context, it is normally expected than all Futures are awaited, +/// and that is the basis of the lint unawaited_futures which is turned on for +/// the flutter_tools package. However, there are times where one or more +/// futures are intentionally not awaited. This function may be used to ignore a +/// particular future. It silences the unawaited_futures lint. +void unawaited(Future future) { } diff --git a/packages/flutter_tools/lib/src/base/process.dart b/packages/flutter_tools/lib/src/base/process.dart index 077b32e8936..de377e04458 100644 --- a/packages/flutter_tools/lib/src/base/process.dart +++ b/packages/flutter_tools/lib/src/base/process.dart @@ -6,6 +6,7 @@ import 'dart:async'; import '../convert.dart'; import '../globals.dart'; +import 'common.dart'; import 'file_system.dart'; import 'io.dart'; import 'process_manager.dart'; @@ -193,7 +194,7 @@ Future runInteractively(List command, { ); // The real stdin will never finish streaming. Pipe until the child process // finishes. - process.stdin.addStream(stdin); // ignore: unawaited_futures + unawaited(process.stdin.addStream(stdin)); // Wait for stdout and stderr to be fully processed, because process.exitCode // may complete first. await Future.wait(>[ diff --git a/packages/flutter_tools/lib/src/commands/analyze_once.dart b/packages/flutter_tools/lib/src/commands/analyze_once.dart index e75d3790ef2..d0c65365882 100644 --- a/packages/flutter_tools/lib/src/commands/analyze_once.dart +++ b/packages/flutter_tools/lib/src/commands/analyze_once.dart @@ -93,11 +93,11 @@ class AnalyzeOnce extends AnalyzeBase { await server.start(); // Completing the future in the callback can't fail. - server.onExit.then((int exitCode) { // ignore: unawaited_futures + unawaited(server.onExit.then((int exitCode) { if (!analysisCompleter.isCompleted) { analysisCompleter.completeError('analysis server exited: $exitCode'); } - }); + })); Cache.releaseLockEarly(); diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart index 0a261e08bfb..29ccf3553f3 100644 --- a/packages/flutter_tools/lib/src/commands/daemon.dart +++ b/packages/flutter_tools/lib/src/commands/daemon.dart @@ -421,23 +421,24 @@ class AppDomain extends Domain { connectionInfoCompleter = Completer(); // We don't want to wait for this future to complete and callbacks won't fail. // As it just writes to stdout. - connectionInfoCompleter.future.then((DebugConnectionInfo info) { // ignore: unawaited_futures - final Map params = { - 'port': info.httpUri.port, - 'wsUri': info.wsUri.toString(), - }; - if (info.baseUri != null) - params['baseUri'] = info.baseUri; - _sendAppEvent(app, 'debugPort', params); - }); + unawaited(connectionInfoCompleter.future.then( + (DebugConnectionInfo info) { + final Map params = { + 'port': info.httpUri.port, + 'wsUri': info.wsUri.toString(), + }; + if (info.baseUri != null) + params['baseUri'] = info.baseUri; + _sendAppEvent(app, 'debugPort', params); + }, + )); } final Completer appStartedCompleter = Completer(); // We don't want to wait for this future to complete, and callbacks won't fail, // as it just writes to stdout. - appStartedCompleter.future // ignore: unawaited_futures - .then((void value) { - _sendAppEvent(app, 'started'); - }); + unawaited(appStartedCompleter.future.then((void value) { + _sendAppEvent(app, 'started'); + })); await app._runInZone(this, () async { try { diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart index d45e43bde72..1a31645b093 100644 --- a/packages/flutter_tools/lib/src/commands/run.dart +++ b/packages/flutter_tools/lib/src/commands/run.dart @@ -398,9 +398,9 @@ class RunCommand extends RunCommandBase { // Do not add more operations to the future. final Completer appStartedTimeRecorder = Completer.sync(); // This callback can't throw. - appStartedTimeRecorder.future.then( // ignore: unawaited_futures + unawaited(appStartedTimeRecorder.future.then( (_) { appStartedTime = systemClock.now(); } - ); + )); final int result = await runner.run( appStartedCompleter: appStartedTimeRecorder, diff --git a/packages/flutter_tools/lib/src/dart/analysis.dart b/packages/flutter_tools/lib/src/dart/analysis.dart index df4b2d1838d..863d2909ab6 100644 --- a/packages/flutter_tools/lib/src/dart/analysis.dart +++ b/packages/flutter_tools/lib/src/dart/analysis.dart @@ -5,6 +5,7 @@ import 'dart:async'; import 'dart:math' as math; +import '../base/common.dart'; import '../base/file_system.dart' hide IOSink; import '../base/file_system.dart'; import '../base/io.dart'; @@ -42,7 +43,7 @@ class AnalysisServer { printTrace('dart ${command.skip(1).join(' ')}'); _process = await processManager.start(command); // This callback hookup can't throw. - _process.exitCode.whenComplete(() => _process = null); // ignore: unawaited_futures + unawaited(_process.exitCode.whenComplete(() => _process = null)); final Stream errorStream = _process.stderr.transform(utf8.decoder).transform(const LineSplitter()); diff --git a/packages/flutter_tools/lib/src/devfs.dart b/packages/flutter_tools/lib/src/devfs.dart index dece8571cbd..95fc2133495 100644 --- a/packages/flutter_tools/lib/src/devfs.dart +++ b/packages/flutter_tools/lib/src/devfs.dart @@ -7,6 +7,7 @@ import 'package:json_rpc_2/json_rpc_2.dart' as rpc; import 'package:meta/meta.dart'; import 'asset.dart'; +import 'base/common.dart'; import 'base/context.dart'; import 'base/file_system.dart'; import 'base/io.dart'; @@ -336,7 +337,7 @@ class _DevFSHttpWriter { if (retry < kMaxRetries) { printTrace('Retrying writing "$deviceUri" to DevFS due to error: $e'); // Synchronization is handled by the _completer below. - _scheduleWrite(deviceUri, content, retry + 1); // ignore: unawaited_futures + unawaited(_scheduleWrite(deviceUri, content, retry + 1)); return; } else { printError('Error writing "$deviceUri" to DevFS: $e'); diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart index 7ed0462fbf3..844bdbfdafc 100644 --- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart +++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart @@ -403,11 +403,11 @@ class _FuchsiaPortForwarder extends DevicePortForwarder { '-L', '$hostPort:$_ipv4Loopback:$devicePort', device.id, 'true' ]; final Process process = await processManager.start(command); - process.exitCode.then((int exitCode) { // ignore: unawaited_futures + unawaited(process.exitCode.then((int exitCode) { if (exitCode != 0) { throwToolExit('Failed to forward port:$devicePort'); } - }); + })); _processes[hostPort] = process; _forwardedPorts.add(ForwardedPort(hostPort, devicePort)); return hostPort; diff --git a/packages/flutter_tools/lib/src/ios/code_signing.dart b/packages/flutter_tools/lib/src/ios/code_signing.dart index 7778654766d..a29a97e394f 100644 --- a/packages/flutter_tools/lib/src/ios/code_signing.dart +++ b/packages/flutter_tools/lib/src/ios/code_signing.dart @@ -158,7 +158,7 @@ Future> getCodeSigningIdentityDevelopmentTeam({ final String opensslOutput = await utf8.decodeStream(opensslProcess.stdout); // Fire and forget discard of the stderr stream so we don't hold onto resources. // Don't care about the result. - opensslProcess.stderr.drain(); // ignore: unawaited_futures + unawaited(opensslProcess.stderr.drain()); if (await opensslProcess.exitCode != 0) return null; diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart index 01d8c5cb2dc..3bd4262d5f6 100644 --- a/packages/flutter_tools/lib/src/ios/mac.dart +++ b/packages/flutter_tools/lib/src/ios/mac.dart @@ -480,7 +480,7 @@ Future buildXcodeProject({ } // Trigger the start of the pipe -> stdout loop. Ignore exceptions. - listenToScriptOutputLine(); // ignore: unawaited_futures + unawaited(listenToScriptOutputLine()); buildCommands.add('SCRIPT_OUTPUT_STREAM_FILE=${scriptOutputPipeFile.absolute.path}'); } diff --git a/packages/flutter_tools/lib/src/ios/simulators.dart b/packages/flutter_tools/lib/src/ios/simulators.dart index 275264f69ec..90c2d674a27 100644 --- a/packages/flutter_tools/lib/src/ios/simulators.dart +++ b/packages/flutter_tools/lib/src/ios/simulators.dart @@ -538,10 +538,10 @@ class _IOSSimulatorLogReader extends DeviceLogReader { // We don't want to wait for the process or its callback. Best effort // cleanup in the callback. - _deviceProcess.exitCode.whenComplete(() { // ignore: unawaited_futures + unawaited(_deviceProcess.exitCode.whenComplete(() { if (_linesController.hasListener) _linesController.close(); - }); + })); } // Match the log prefix (in order to shorten it): diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart index 3a6a9fa23ee..d881ddd6db6 100644 --- a/packages/flutter_tools/lib/src/resident_runner.dart +++ b/packages/flutter_tools/lib/src/resident_runner.dart @@ -9,6 +9,7 @@ import 'package:meta/meta.dart'; import 'application_package.dart'; import 'artifacts.dart'; import 'asset.dart'; +import 'base/common.dart'; import 'base/file_system.dart'; import 'base/io.dart'; import 'base/logger.dart'; @@ -739,10 +740,10 @@ abstract class ResidentRunner { // This hooks up callbacks for when the connection stops in the future. // We don't want to wait for them. We don't handle errors in those callbacks' // futures either because they just print to logger and is not critical. - service.done.then( // ignore: unawaited_futures + unawaited(service.done.then( _serviceProtocolDone, onError: _serviceProtocolError - ).whenComplete(_serviceDisconnected); + ).whenComplete(_serviceDisconnected)); } } } diff --git a/packages/flutter_tools/lib/src/run_hot.dart b/packages/flutter_tools/lib/src/run_hot.dart index b1bd42bafa9..27541dd3075 100644 --- a/packages/flutter_tools/lib/src/run_hot.dart +++ b/packages/flutter_tools/lib/src/run_hot.dart @@ -502,13 +502,17 @@ class HotRunner extends ResidentRunner { // Reload the isolate. final Completer completer = Completer(); futures.add(completer.future); - view.uiIsolate.reload().then((ServiceObject _) { // ignore: unawaited_futures - final ServiceEvent pauseEvent = view.uiIsolate.pauseEvent; - if ((pauseEvent != null) && pauseEvent.isPauseEvent) { - // Resume the isolate so that it can be killed by the embedder. - return view.uiIsolate.resume(); - } - }).whenComplete(() { completer.complete(null); }); + unawaited(view.uiIsolate.reload().then( + (ServiceObject _) { + final ServiceEvent pauseEvent = view.uiIsolate.pauseEvent; + if ((pauseEvent != null) && pauseEvent.isPauseEvent) { + // Resume the isolate so that it can be killed by the embedder. + return view.uiIsolate.resume(); + } + }, + ).whenComplete( + () { completer.complete(null); }, + )); } } } @@ -681,15 +685,19 @@ class HotRunner extends ResidentRunner { final List>> reportFutures = device.reloadSources( entryPath, pause: pause ); - Future.wait(reportFutures).then((List> reports) async { // ignore: unawaited_futures - // TODO(aam): Investigate why we are validating only first reload report, - // which seems to be current behavior - final Map firstReport = reports.first; - // Don't print errors because they will be printed further down when - // `validateReloadReport` is called again. - await device.updateReloadStatus(validateReloadReport(firstReport, printErrors: false)); - completer.complete(DeviceReloadReport(device, reports)); - }); + unawaited(Future.wait(reportFutures).then( + (List> reports) async { + // TODO(aam): Investigate why we are validating only first reload report, + // which seems to be current behavior + final Map firstReport = reports.first; + // Don't print errors because they will be printed further down when + // `validateReloadReport` is called again. + await device.updateReloadStatus( + validateReloadReport(firstReport, printErrors: false), + ); + completer.complete(DeviceReloadReport(device, reports)); + }, + )); } final List reports = await Future.wait(allReportsFutures); for (DeviceReloadReport report in reports) { @@ -749,9 +757,9 @@ class HotRunner extends ResidentRunner { futuresViews.add(view.uiIsolate.reload()); } final Completer deviceCompleter = Completer(); - Future.wait(futuresViews).whenComplete(() { // ignore: unawaited_futures + unawaited(Future.wait(futuresViews).whenComplete(() { deviceCompleter.complete(device.refreshViews()); - }); + })); allDevices.add(deviceCompleter.future); } await Future.wait(allDevices); diff --git a/packages/flutter_tools/lib/src/test/flutter_platform.dart b/packages/flutter_tools/lib/src/test/flutter_platform.dart index a7071e8c75a..f93900f1c4d 100644 --- a/packages/flutter_tools/lib/src/test/flutter_platform.dart +++ b/packages/flutter_tools/lib/src/test/flutter_platform.dart @@ -495,9 +495,9 @@ class _FlutterPlatform extends PlatformPlugin { bool controllerSinkClosed = false; try { // Callback can't throw since it's just setting a variable. - controller.sink.done.whenComplete(() { // ignore: unawaited_futures + unawaited(controller.sink.done.whenComplete(() { controllerSinkClosed = true; - }); + })); // Prepare our WebSocket server to talk to the engine subproces. final HttpServer server = await HttpServer.bind(host, port); @@ -653,7 +653,7 @@ class _FlutterPlatform extends PlatformPlugin { shellPath); controller.sink.addError(message); // Awaited for with 'sink.done' below. - controller.sink.close(); // ignore: unawaited_futures + unawaited(controller.sink.close()); printTrace('test $ourTestCount: waiting for controller sink to close'); await controller.sink.done; await watcher?.handleTestCrashed(ProcessEvent(ourTestCount, process)); @@ -666,7 +666,7 @@ class _FlutterPlatform extends PlatformPlugin { final String message = _getErrorMessage('Test never connected to test harness.', testPath, shellPath); controller.sink.addError(message); // Awaited for with 'sink.done' below. - controller.sink.close(); // ignore: unawaited_futures + unawaited(controller.sink.close()); printTrace('test $ourTestCount: waiting for controller sink to close'); await controller.sink.done; await watcher @@ -748,7 +748,7 @@ class _FlutterPlatform extends PlatformPlugin { shellPath); controller.sink.addError(message); // Awaited for with 'sink.done' below. - controller.sink.close(); // ignore: unawaited_futures + unawaited(controller.sink.close()); printTrace('test $ourTestCount: waiting for controller sink to close'); await controller.sink.done; break; @@ -792,7 +792,7 @@ class _FlutterPlatform extends PlatformPlugin { } if (!controllerSinkClosed) { // Waiting below with await. - controller.sink.close(); // ignore: unawaited_futures + unawaited(controller.sink.close()); printTrace('test $ourTestCount: waiting for controller sink to close'); await controller.sink.done; } diff --git a/packages/flutter_tools/lib/src/tester/flutter_tester.dart b/packages/flutter_tools/lib/src/tester/flutter_tester.dart index 30861beae1b..ea52c548f7a 100644 --- a/packages/flutter_tools/lib/src/tester/flutter_tester.dart +++ b/packages/flutter_tools/lib/src/tester/flutter_tester.dart @@ -152,7 +152,7 @@ class FlutterTesterDevice extends Device { }, ); // Setting a bool can't fail in the callback. - _process.exitCode.then((_) => _isRunning = false); // ignore: unawaited_futures + unawaited(_process.exitCode.then((_) => _isRunning = false)); _process.stdout .transform(utf8.decoder) .transform(const LineSplitter()) diff --git a/packages/flutter_tools/test/compile_test.dart b/packages/flutter_tools/test/compile_test.dart index c8580bdcd46..bbaad0c2d86 100644 --- a/packages/flutter_tools/test/compile_test.dart +++ b/packages/flutter_tools/test/compile_test.dart @@ -5,6 +5,7 @@ import 'dart:async'; import 'dart:convert'; +import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/context.dart'; @@ -445,23 +446,26 @@ example:org-dartlang-app:///lib/ ])); // The test manages timing via completers. - generator.recompile( // ignore: unawaited_futures - '/path/to/main.dart', - null, /* invalidatedFiles */ - outputPath: '/build/', - ).then((CompilerOutput outputCompile) { - expect(logger.errorText, - equals('\nCompiler message:\nline1\nline2\n')); - expect(outputCompile.outputFilename, equals('/path/to/main.dart.dill')); + unawaited( + generator.recompile( + '/path/to/main.dart', + null, /* invalidatedFiles */ + outputPath: '/build/', + ).then((CompilerOutput outputCompile) { + expect(logger.errorText, + equals('\nCompiler message:\nline1\nline2\n')); + expect(outputCompile.outputFilename, equals('/path/to/main.dart.dill')); - compileExpressionResponseCompleter1.complete(Future>.value(utf8.encode( - 'result def\nline1\nline2\ndef /path/to/main.dart.dill.incremental 0\n' - ))); - }); + compileExpressionResponseCompleter1.complete(Future>.value(utf8.encode( + 'result def\nline1\nline2\ndef /path/to/main.dart.dill.incremental 0\n' + ))); + }), + ); // The test manages timing via completers. final Completer lastExpressionCompleted = Completer(); - generator.compileExpression('0+1', null, null, null, null, false).then( // ignore: unawaited_futures + unawaited( + generator.compileExpression('0+1', null, null, null, null, false).then( (CompilerOutput outputExpression) { expect(outputExpression, isNotNull); expect(outputExpression.outputFilename, @@ -470,17 +474,22 @@ example:org-dartlang-app:///lib/ compileExpressionResponseCompleter2.complete(Future>.value(utf8.encode( 'result def\nline1\nline2\ndef /path/to/main.dart.dill.incremental 0\n' ))); - }); + }, + ), + ); // The test manages timing via completers. - generator.compileExpression('1+1', null, null, null, null, false).then( // ignore: unawaited_futures + unawaited( + generator.compileExpression('1+1', null, null, null, null, false).then( (CompilerOutput outputExpression) { expect(outputExpression, isNotNull); expect(outputExpression.outputFilename, equals('/path/to/main.dart.dill.incremental')); expect(outputExpression.errorCount, 0); lastExpressionCompleted.complete(true); - }); + }, + ) + ); compileResponseCompleter.complete(Future>.value(utf8.encode( 'result abc\nline1\nline2\nabc /path/to/main.dart.dill 0\n' diff --git a/packages/flutter_tools/test/integration/hot_reload_test.dart b/packages/flutter_tools/test/integration/hot_reload_test.dart index 5bd3b36ad10..fae2ae66608 100644 --- a/packages/flutter_tools/test/integration/hot_reload_test.dart +++ b/packages/flutter_tools/test/integration/hot_reload_test.dart @@ -5,6 +5,7 @@ import 'dart:async'; import 'package:file/file.dart'; +import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:vm_service_lib/vm_service_lib.dart'; @@ -76,10 +77,10 @@ void main() { }, ); await _flutter.resume(); // we start paused so we can set up our TICK 1 listener before the app starts - sawTick1.future.timeout( // ignore: unawaited_futures + unawaited(sawTick1.future.timeout( const Duration(seconds: 5), onTimeout: () { print('The test app is taking longer than expected to print its synchronization line...'); }, - ); + )); await sawTick1.future; // after this, app is in steady state await _flutter.addBreakpoint( _project.scheduledBreakpointUri, diff --git a/packages/flutter_tools/test/integration/test_driver.dart b/packages/flutter_tools/test/integration/test_driver.dart index b95e2c20ab4..952f2271099 100644 --- a/packages/flutter_tools/test/integration/test_driver.dart +++ b/packages/flutter_tools/test/integration/test_driver.dart @@ -6,6 +6,7 @@ import 'dart:async'; import 'dart:convert'; import 'package:file/file.dart'; +import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:meta/meta.dart'; @@ -104,10 +105,10 @@ abstract class FlutterTestDriver { // This class doesn't use the result of the future. It's made available // via a getter for external uses. - _process.exitCode.then((int code) { // ignore: unawaited_futures + unawaited(_process.exitCode.then((int code) { _debugPrint('Process exited ($code)'); _hasExited = true; - }); + })); transformToLines(_process.stdout).listen((String line) => _stdout.add(line)); transformToLines(_process.stderr).listen((String line) => _stderr.add(line)); diff --git a/packages/flutter_tools/tool/daemon_client.dart b/packages/flutter_tools/tool/daemon_client.dart index d064a86bdd7..a05cc99a6df 100644 --- a/packages/flutter_tools/tool/daemon_client.dart +++ b/packages/flutter_tools/tool/daemon_client.dart @@ -4,9 +4,10 @@ import 'dart:async'; import 'dart:convert'; - import 'dart:io'; +import 'package:flutter_tools/src/base/common.dart'; + Process daemon; // To use, start from the console and enter: @@ -82,10 +83,10 @@ Future main() async { }); // Print in the callback can't fail. - daemon.exitCode.then((int code) { // ignore: unawaited_futures + unawaited(daemon.exitCode.then((int code) { print('daemon exiting ($code)'); exit(code); - }); + })); } int id = 0;