diff --git a/packages/flutter_tools/lib/src/custom_devices/custom_device.dart b/packages/flutter_tools/lib/src/custom_devices/custom_device.dart index 6b93a12345..d5fff62f93 100644 --- a/packages/flutter_tools/lib/src/custom_devices/custom_device.dart +++ b/packages/flutter_tools/lib/src/custom_devices/custom_device.dart @@ -385,7 +385,6 @@ class CustomDeviceAppSession { final ProtocolDiscovery discovery = ProtocolDiscovery.observatory( logReader, portForwarder: _device._config.usesPortForwarding ? _device.portForwarder : null, - hostPort: null, devicePort: null, logger: _logger, ipv6: ipv6, ); diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart index ad8eb6b974..f3d0b21eed 100644 --- a/packages/flutter_tools/lib/src/device.dart +++ b/packages/flutter_tools/lib/src/device.dart @@ -214,7 +214,7 @@ abstract class DeviceManager { /// /// * If [flutterProject] is null, then assume the project supports all /// device types. - Future> findTargetDevices(FlutterProject flutterProject, { Duration? timeout }) async { + Future> findTargetDevices(FlutterProject? flutterProject, { Duration? timeout }) async { if (timeout != null) { // Reset the cache with the specified timeout. await refreshAllConnectedDevices(timeout: timeout); @@ -317,7 +317,7 @@ abstract class DeviceManager { /// /// This exists to allow the check to be overridden for google3 clients. If /// [flutterProject] is null then return true. - bool isDeviceSupportedForProject(Device device, FlutterProject flutterProject) { + bool isDeviceSupportedForProject(Device device, FlutterProject? flutterProject) { if (flutterProject == null) { return true; } diff --git a/packages/flutter_tools/lib/src/protocol_discovery.dart b/packages/flutter_tools/lib/src/protocol_discovery.dart index 2a36d8b306..53edbddd22 100644 --- a/packages/flutter_tools/lib/src/protocol_discovery.dart +++ b/packages/flutter_tools/lib/src/protocol_discovery.dart @@ -2,12 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// @dart = 2.8 - import 'dart:async'; -import 'package:meta/meta.dart'; - import 'base/io.dart'; import 'base/logger.dart'; import 'device.dart'; @@ -20,28 +16,27 @@ class ProtocolDiscovery { this.logReader, this.serviceName, { this.portForwarder, - this.throttleDuration, + required this.throttleDuration, this.hostPort, this.devicePort, - this.ipv6, - Logger logger, + required this.ipv6, + required Logger logger, }) : _logger = logger, assert(logReader != null) { _deviceLogSubscription = logReader.logLines.listen( _handleLine, onDone: _stopScrapingLogs, ); - _uriStreamController = _BufferedStreamController(); } factory ProtocolDiscovery.observatory( DeviceLogReader logReader, { - DevicePortForwarder portForwarder, - Duration throttleDuration, - @required int hostPort, - @required int devicePort, - @required bool ipv6, - @required Logger logger, + DevicePortForwarder? portForwarder, + Duration? throttleDuration, + int? hostPort, + int? devicePort, + required bool ipv6, + required Logger logger, }) { const String kObservatoryService = 'Observatory'; return ProtocolDiscovery._( @@ -58,17 +53,17 @@ class ProtocolDiscovery { final DeviceLogReader logReader; final String serviceName; - final DevicePortForwarder portForwarder; - final int hostPort; - final int devicePort; + final DevicePortForwarder? portForwarder; + final int? hostPort; + final int? devicePort; final bool ipv6; final Logger _logger; /// The time to wait before forwarding a new observatory URIs from [logReader]. final Duration throttleDuration; - StreamSubscription _deviceLogSubscription; - _BufferedStreamController _uriStreamController; + StreamSubscription? _deviceLogSubscription; + final _BufferedStreamController _uriStreamController = _BufferedStreamController(); /// The discovered service URL. /// @@ -76,7 +71,7 @@ class ProtocolDiscovery { /// /// Use [uris] instead. // TODO(egarciad): replace `uri` for `uris`. - Future get uri async { + Future get uri async { try { return await uris.first; } on StateError { @@ -103,26 +98,26 @@ class ProtocolDiscovery { Future cancel() => _stopScrapingLogs(); Future _stopScrapingLogs() async { - await _uriStreamController?.close(); + await _uriStreamController.close(); await _deviceLogSubscription?.cancel(); _deviceLogSubscription = null; } - Match _getPatternMatch(String line) { + Match? _getPatternMatch(String line) { final RegExp r = RegExp(RegExp.escape(serviceName) + r' listening on ((http|//)[a-zA-Z0-9:/=_\-\.\[\]]+)'); return r.firstMatch(line); } - Uri _getObservatoryUri(String line) { - final Match match = _getPatternMatch(line); + Uri? _getObservatoryUri(String line) { + final Match? match = _getPatternMatch(line); if (match != null) { - return Uri.parse(match[1]); + return Uri.parse(match[1]!); } return null; } void _handleLine(String line) { - Uri uri; + Uri? uri; try { uri = _getObservatoryUri(line); } on FormatException catch (error, stackTrace) { @@ -142,9 +137,10 @@ class ProtocolDiscovery { _logger.printTrace('$serviceName URL on device: $deviceUri'); Uri hostUri = deviceUri; - if (portForwarder != null) { + final DevicePortForwarder? forwarder = portForwarder; + if (forwarder != null) { final int actualDevicePort = deviceUri.port; - final int actualHostPort = await portForwarder.forward(actualDevicePort, hostPort: hostPort); + final int actualHostPort = await forwarder.forward(actualDevicePort, hostPort: hostPort); _logger.printTrace('Forwarded host port $actualHostPort to device port $actualDevicePort for $serviceName'); hostUri = deviceUri.replace(port: actualHostPort); } @@ -167,25 +163,24 @@ class _BufferedStreamController { return _streamController.stream; } - StreamController _streamControllerInstance; - - StreamController get _streamController { - _streamControllerInstance ??= StreamController.broadcast(onListen: () { + late final StreamController _streamController = () { + final StreamController streamControllerInstance = StreamController.broadcast(); + streamControllerInstance.onListen = () { for (final dynamic event in _events) { assert(T is! List); if (event is T) { - _streamControllerInstance.add(event); + streamControllerInstance.add(event); } else { - _streamControllerInstance.addError( + streamControllerInstance.addError( (event as Iterable).first as Object, - (event as Iterable).last as StackTrace, + event.last as StackTrace, ); } } _events.clear(); - }); - return _streamControllerInstance; - } + }; + return streamControllerInstance; + }(); final List _events; @@ -200,7 +195,7 @@ class _BufferedStreamController { } /// Sends or enqueues an error event. - void addError(Object error, [StackTrace stackTrace]) { + void addError(Object error, [StackTrace? stackTrace]) { if (_streamController.hasListener) { _streamController.addError(error, stackTrace); } else { @@ -220,13 +215,13 @@ class _BufferedStreamController { /// and arrival times: `a (0ms), b (5ms), c (11ms), d (21ms)`. /// The events `a`, `c`, and `d` will be produced as a result. StreamTransformer _throttle({ - @required Duration waitDuration, + required Duration waitDuration, }) { assert(waitDuration != null); S latestLine; - int lastExecution; - Future throttleFuture; + int? lastExecution; + Future? throttleFuture; bool done = false; return StreamTransformer @@ -237,7 +232,7 @@ StreamTransformer _throttle({ final bool isFirstMessage = lastExecution == null; final int currentTime = DateTime.now().millisecondsSinceEpoch; lastExecution ??= currentTime; - final int remainingTime = currentTime - lastExecution; + final int remainingTime = currentTime - lastExecution!; // Always send the first event immediately. final int nextExecutionTime = isFirstMessage || remainingTime > waitDuration.inMilliseconds diff --git a/packages/flutter_tools/test/general.shard/device_test.dart b/packages/flutter_tools/test/general.shard/device_test.dart index 4c36c91707..2bd6117f8c 100644 --- a/packages/flutter_tools/test/general.shard/device_test.dart +++ b/packages/flutter_tools/test/general.shard/device_test.dart @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// @dart = 2.8 - import 'dart:async'; import 'package:fake_async/fake_async.dart'; @@ -14,7 +12,6 @@ import 'package:flutter_tools/src/base/user_messages.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/project.dart'; -import 'package:meta/meta.dart'; import 'package:test/fake.dart'; import '../src/common.dart'; @@ -491,37 +488,37 @@ void main() { class TestDeviceManager extends DeviceManager { TestDeviceManager( List allDevices, { - List deviceDiscoveryOverrides, - @required Logger logger, - @required Terminal terminal, - String wellKnownId, - }) : super(logger: logger, terminal: terminal, userMessages: UserMessages()) { - _fakeDeviceDiscoverer = FakePollingDeviceDiscovery(); + List? deviceDiscoveryOverrides, + required Logger logger, + required Terminal terminal, + String? wellKnownId, + }) : _fakeDeviceDiscoverer = FakePollingDeviceDiscovery(), + _deviceDiscoverers = [], + super(logger: logger, terminal: terminal, userMessages: UserMessages()) { if (wellKnownId != null) { _fakeDeviceDiscoverer.wellKnownIds.add(wellKnownId); } - _deviceDiscoverers = [ - _fakeDeviceDiscoverer, - if (deviceDiscoveryOverrides != null) - ...deviceDiscoveryOverrides - ]; + _deviceDiscoverers.add(_fakeDeviceDiscoverer); + if (deviceDiscoveryOverrides != null) { + _deviceDiscoverers.addAll(deviceDiscoveryOverrides); + } resetDevices(allDevices); } @override List get deviceDiscoverers => _deviceDiscoverers; - List _deviceDiscoverers; - FakePollingDeviceDiscovery _fakeDeviceDiscoverer; + final List _deviceDiscoverers; + final FakePollingDeviceDiscovery _fakeDeviceDiscoverer; void resetDevices(List allDevices) { _fakeDeviceDiscoverer.setDevices(allDevices); } - bool isAlwaysSupportedOverride; + bool? isAlwaysSupportedOverride; @override - bool isDeviceSupportedForProject(Device device, FlutterProject flutterProject) { + bool isDeviceSupportedForProject(Device device, FlutterProject? flutterProject) { if (isAlwaysSupportedOverride != null) { - return isAlwaysSupportedOverride; + return isAlwaysSupportedOverride!; } return super.isDeviceSupportedForProject(device, flutterProject); } @@ -543,7 +540,7 @@ class MockDeviceDiscovery extends Fake implements DeviceDiscovery { } @override - Future> discoverDevices({Duration timeout}) async { + Future> discoverDevices({Duration? timeout}) async { discoverDevicesCalled += 1; return deviceValues; } @@ -560,18 +557,18 @@ class LongPollingDeviceDiscovery extends PollingDeviceDiscovery { final Completer> _completer = Completer>(); @override - Future> pollingGetDevices({ Duration timeout }) async { + Future> pollingGetDevices({ Duration? timeout }) async { return _completer.future; } @override Future stopPolling() async { - _completer.complete(); + _completer.complete([]); } @override Future dispose() async { - _completer.complete(); + _completer.complete([]); } @override @@ -588,7 +585,7 @@ class ThrowingPollingDeviceDiscovery extends PollingDeviceDiscovery { ThrowingPollingDeviceDiscovery() : super('throw'); @override - Future> pollingGetDevices({ Duration timeout }) async { + Future> pollingGetDevices({ Duration? timeout }) async { throw const ProcessException('fake-discovery', []); } @@ -614,15 +611,15 @@ class FakeTerminal extends Fake implements Terminal { _nextResult = result; } - List _nextPrompt; - String _nextResult; + List? _nextPrompt; + late String _nextResult; @override Future promptForCharInput( List acceptedCharacters, { - Logger logger, - String prompt, - int defaultChoiceIndex, + Logger? logger, + String? prompt, + int? defaultChoiceIndex, bool displayAcceptedCharacters = true, }) async { expect(acceptedCharacters, _nextPrompt); diff --git a/packages/flutter_tools/test/general.shard/protocol_discovery_test.dart b/packages/flutter_tools/test/general.shard/protocol_discovery_test.dart index f7083f06cb..ea90e92010 100644 --- a/packages/flutter_tools/test/general.shard/protocol_discovery_test.dart +++ b/packages/flutter_tools/test/general.shard/protocol_discovery_test.dart @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// @dart = 2.8 - import 'package:fake_async/fake_async.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/device_port_forwarder.dart'; @@ -14,16 +12,14 @@ import '../src/fake_devices.dart'; void main() { group('service_protocol discovery', () { - FakeDeviceLogReader logReader; - ProtocolDiscovery discoverer; + late FakeDeviceLogReader logReader; + late ProtocolDiscovery discoverer; setUp(() { logReader = FakeDeviceLogReader(); discoverer = ProtocolDiscovery.observatory( logReader, ipv6: false, - hostPort: null, - devicePort: null, throttleDuration: const Duration(milliseconds: 5), logger: BufferLogger.test(), ); @@ -42,20 +38,20 @@ void main() { testWithoutContext('discovers uri if logs already produced output', () async { logReader.addLine('HELLO WORLD'); logReader.addLine('Observatory listening on http://127.0.0.1:9999'); - final Uri uri = await discoverer.uri; + final Uri uri = (await discoverer.uri)!; expect(uri.port, 9999); expect('$uri', 'http://127.0.0.1:9999'); }); testWithoutContext('does not discover uri with no host', () async { - final Future pendingUri = discoverer.uri; + final Future pendingUri = discoverer.uri; logReader.addLine('Observatory listening on http12asdasdsd9999'); await Future.delayed(const Duration(milliseconds: 10)); logReader.addLine('Observatory listening on http://127.0.0.1:9999'); await Future.delayed(Duration.zero); - final Uri uri = await pendingUri; + final Uri uri = (await pendingUri)!; expect(uri, isNotNull); expect(uri.port, 9999); expect('$uri', 'http://127.0.0.1:9999'); @@ -67,7 +63,7 @@ void main() { await Future.delayed(Duration.zero); - final Uri uri = await discoverer.uri; + final Uri uri = (await discoverer.uri)!; expect(uri, isNotNull); expect(uri.port, 9999); expect('$uri', 'http://127.0.0.1:9999'); @@ -82,16 +78,16 @@ void main() { }); testWithoutContext('discovers uri if logs not yet produced output', () async { - final Future uriFuture = discoverer.uri; + final Future uriFuture = discoverer.uri; logReader.addLine('Observatory listening on http://127.0.0.1:3333'); - final Uri uri = await uriFuture; + final Uri uri = (await uriFuture)!; expect(uri.port, 3333); expect('$uri', 'http://127.0.0.1:3333'); }); testWithoutContext('discovers uri with Ascii Esc code', () async { logReader.addLine('Observatory listening on http://127.0.0.1:3333\x1b['); - final Uri uri = await discoverer.uri; + final Uri uri = (await discoverer.uri)!; expect(uri.port, 3333); expect('$uri', 'http://127.0.0.1:3333'); }); @@ -102,17 +98,17 @@ void main() { }); testWithoutContext('uri is null when the log reader closes early', () async { - final Future uriFuture = discoverer.uri; + final Future uriFuture = discoverer.uri; await logReader.dispose(); expect(await uriFuture, isNull); }); testWithoutContext('uri waits for correct log line', () async { - final Future uriFuture = discoverer.uri; + final Future uriFuture = discoverer.uri; logReader.addLine('Observatory not listening...'); final Uri timeoutUri = Uri.parse('http://timeout'); - final Uri actualUri = await uriFuture.timeout( + final Uri? actualUri = await uriFuture.timeout( const Duration(milliseconds: 100), onTimeout: () => timeoutUri, ); @@ -121,23 +117,23 @@ void main() { testWithoutContext('discovers uri if log line contains Android prefix', () async { logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:52584'); - final Uri uri = await discoverer.uri; + final Uri uri = (await discoverer.uri)!; expect(uri.port, 52584); expect('$uri', 'http://127.0.0.1:52584'); }); testWithoutContext('discovers uri if log line contains auth key', () async { - final Future uriFuture = discoverer.uri; + final Future uriFuture = discoverer.uri; logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:54804/PTwjm8Ii8qg=/'); - final Uri uri = await uriFuture; + final Uri uri = (await uriFuture)!; expect(uri.port, 54804); expect('$uri', 'http://127.0.0.1:54804/PTwjm8Ii8qg=/'); }); testWithoutContext('discovers uri if log line contains non-localhost', () async { - final Future uriFuture = discoverer.uri; + final Future uriFuture = discoverer.uri; logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:54804/PTwjm8Ii8qg=/'); - final Uri uri = await uriFuture; + final Uri uri = (await uriFuture)!; expect(uri.port, 54804); expect('$uri', 'http://127.0.0.1:54804/PTwjm8Ii8qg=/'); }); @@ -146,15 +142,14 @@ void main() { discoverer = ProtocolDiscovery.observatory( logReader, ipv6: false, - hostPort: null, devicePort: 12346, throttleDuration: const Duration(milliseconds: 200), logger: BufferLogger.test(), ); - final Future uriFuture = discoverer.uri; + final Future uriFuture = discoverer.uri; logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:12345/PTwjm8Ii8qg=/'); logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:12346/PTwjm8Ii8qg=/'); - final Uri uri = await uriFuture; + final Uri uri = (await uriFuture)!; expect(uri.port, 12346); expect('$uri', 'http://127.0.0.1:12346/PTwjm8Ii8qg=/'); }); @@ -163,15 +158,14 @@ void main() { discoverer = ProtocolDiscovery.observatory( logReader, ipv6: false, - hostPort: null, devicePort: 12346, throttleDuration: const Duration(milliseconds: 200), logger: BufferLogger.test(), ); - final Future uriFuture = discoverer.uri; + final Future uriFuture = discoverer.uri; logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:12346/PTwjm8Ii8qg=/'); logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:12345/PTwjm8Ii8qg=/'); - final Uri uri = await uriFuture; + final Uri uri = (await uriFuture)!; expect(uri.port, 12346); expect('$uri', 'http://127.0.0.1:12346/PTwjm8Ii8qg=/'); }); @@ -188,7 +182,6 @@ void main() { discoverer = ProtocolDiscovery.observatory( logReader, ipv6: false, - hostPort: null, devicePort: 12345, throttleDuration: const Duration(milliseconds: 200), logger: BufferLogger.test(), @@ -205,7 +198,6 @@ void main() { discoverer = ProtocolDiscovery.observatory( logReader, ipv6: false, - hostPort: null, devicePort: 12346, throttleDuration: const Duration(milliseconds: 10), logger: BufferLogger.test(), @@ -227,8 +219,6 @@ void main() { discoverer = ProtocolDiscovery.observatory( logReader, ipv6: false, - hostPort: null, - devicePort: null, throttleDuration: kThrottleDuration, logger: BufferLogger.test(), ); @@ -263,7 +253,6 @@ void main() { discoverer = ProtocolDiscovery.observatory( logReader, ipv6: false, - hostPort: null, devicePort: 12345, throttleDuration: kThrottleTimeInMilliseconds, logger: BufferLogger.test(), @@ -299,16 +288,14 @@ void main() { final ProtocolDiscovery discoverer = ProtocolDiscovery.observatory( logReader, portForwarder: MockPortForwarder(99), - hostPort: null, - devicePort: null, ipv6: false, logger: BufferLogger.test(), ); // Get next port future. - final Future nextUri = discoverer.uri; + final Future nextUri = discoverer.uri; logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:54804/PTwjm8Ii8qg=/'); - final Uri uri = await nextUri; + final Uri uri = (await nextUri)!; expect(uri.port, 99); expect('$uri', 'http://127.0.0.1:99/PTwjm8Ii8qg=/'); @@ -322,15 +309,14 @@ void main() { logReader, portForwarder: MockPortForwarder(99), hostPort: 1243, - devicePort: null, ipv6: false, logger: BufferLogger.test(), ); // Get next port future. - final Future nextUri = discoverer.uri; + final Future nextUri = discoverer.uri; logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:54804/PTwjm8Ii8qg=/'); - final Uri uri = await nextUri; + final Uri uri = (await nextUri)!; expect(uri.port, 1243); expect('$uri', 'http://127.0.0.1:1243/PTwjm8Ii8qg=/'); @@ -344,15 +330,14 @@ void main() { logReader, portForwarder: MockPortForwarder(99), hostPort: 0, - devicePort: null, ipv6: false, logger: BufferLogger.test(), ); // Get next port future. - final Future nextUri = discoverer.uri; + final Future nextUri = discoverer.uri; logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:54804/PTwjm8Ii8qg=/'); - final Uri uri = await nextUri; + final Uri uri = (await nextUri)!; expect(uri.port, 99); expect('$uri', 'http://127.0.0.1:99/PTwjm8Ii8qg=/'); @@ -367,14 +352,13 @@ void main() { portForwarder: MockPortForwarder(99), hostPort: 54777, ipv6: true, - devicePort: null, logger: BufferLogger.test(), ); // Get next port future. - final Future nextUri = discoverer.uri; + final Future nextUri = discoverer.uri; logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:54804/PTwjm8Ii8qg=/'); - final Uri uri = await nextUri; + final Uri uri = (await nextUri)!; expect(uri.port, 54777); expect('$uri', 'http://[::1]:54777/PTwjm8Ii8qg=/'); @@ -389,14 +373,13 @@ void main() { portForwarder: MockPortForwarder(99), hostPort: 54777, ipv6: true, - devicePort: null, logger: BufferLogger.test(), ); // Get next port future. - final Future nextUri = discoverer.uri; + final Future nextUri = discoverer.uri; logReader.addLine('I/flutter : Observatory listening on http://[::1]:54777/PTwjm8Ii8qg=/\x1b['); - final Uri uri = await nextUri; + final Uri uri = (await nextUri)!; expect(uri.port, 54777); expect('$uri', 'http://[::1]:54777/PTwjm8Ii8qg=/'); @@ -410,13 +393,13 @@ void main() { class MockPortForwarder extends DevicePortForwarder { MockPortForwarder([this.availablePort]); - final int availablePort; + final int? availablePort; @override - Future forward(int devicePort, { int hostPort }) async { + Future forward(int devicePort, { int? hostPort }) async { hostPort ??= 0; if (hostPort == 0) { - return availablePort; + return availablePort!; } return hostPort; } diff --git a/packages/flutter_tools/test/src/fake_devices.dart b/packages/flutter_tools/test/src/fake_devices.dart index ea6685b611..2c8ffc56e6 100644 --- a/packages/flutter_tools/test/src/fake_devices.dart +++ b/packages/flutter_tools/test/src/fake_devices.dart @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// @dart = 2.8 - import 'dart:async'; import 'package:flutter_tools/src/application_package.dart'; @@ -64,7 +62,7 @@ class FakeDevice extends Device { bool ephemeral = true, bool isSupported = true, PlatformType type = PlatformType.web, - LaunchResult launchResult, + LaunchResult? launchResult, }) : _isSupported = isSupported, _launchResult = launchResult ?? LaunchResult.succeeded(), super( @@ -82,24 +80,24 @@ class FakeDevice extends Device { @override Future startApp(covariant ApplicationPackage package, { - String mainPath, - String route, - DebuggingOptions debuggingOptions, - Map platformArgs, + String? mainPath, + String? route, + DebuggingOptions? debuggingOptions, + Map? platformArgs, bool prebuiltApplication = false, bool ipv6 = false, - String userIdentifier, + String? userIdentifier, }) async => _launchResult; @override Future stopApp(covariant ApplicationPackage app, { - String userIdentifier, + String? userIdentifier, }) async => true; @override Future uninstallApp( covariant ApplicationPackage app, { - String userIdentifier, + String? userIdentifier, }) async => true; @override @@ -140,12 +138,12 @@ class FakePollingDeviceDiscovery extends PollingDeviceDiscovery { final StreamController _onRemovedController = StreamController.broadcast(); @override - Future> pollingGetDevices({ Duration timeout }) async { + Future> pollingGetDevices({ Duration? timeout }) async { lastPollingTimeout = timeout; return _devices; } - Duration lastPollingTimeout; + Duration? lastPollingTimeout; @override bool get supportsPlatform => true; @@ -185,19 +183,15 @@ class FakeDeviceLogReader extends DeviceLogReader { @override String get name => 'FakeLogReader'; - StreamController _cachedLinesController; - bool disposed = false; final List _lineQueue = []; - StreamController get _linesController { - _cachedLinesController ??= StreamController + late final StreamController _linesController = + StreamController .broadcast(onListen: () { _lineQueue.forEach(_linesController.add); _lineQueue.clear(); }); - return _cachedLinesController; - } @override Stream get logLines => _linesController.stream;