diff --git a/packages/flutter_tools/lib/src/ios/simulators.dart b/packages/flutter_tools/lib/src/ios/simulators.dart index 72b7aa61cad..c7d893737c9 100644 --- a/packages/flutter_tools/lib/src/ios/simulators.dart +++ b/packages/flutter_tools/lib/src/ios/simulators.dart @@ -809,7 +809,8 @@ class _IOSSimulatorDevicePortForwarder extends DevicePortForwarder { @override Future dispose() async { - for (final ForwardedPort port in _ports) { + final List portsCopy = List.from(_ports); + for (final ForwardedPort port in portsCopy) { await unforward(port); } } diff --git a/packages/flutter_tools/test/general.shard/ios/simulators_test.dart b/packages/flutter_tools/test/general.shard/ios/simulators_test.dart index 153ac57fb94..d519d7e32c9 100644 --- a/packages/flutter_tools/test/general.shard/ios/simulators_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/simulators_test.dart @@ -44,6 +44,24 @@ void main() { osx.operatingSystem = 'macos'; }); + group('_IOSSimulatorDevicePortForwarder', () { + testUsingContext('dispose() does not throw an exception', () async { + final IOSSimulator simulator = IOSSimulator('123'); + final DevicePortForwarder portForwarder = simulator.portForwarder; + await portForwarder.forward(123); + await portForwarder.forward(124); + expect(portForwarder.forwardedPorts.length, 2); + try { + await portForwarder.dispose(); + } catch (e) { + fail('Encountered exception: $e'); + } + expect(portForwarder.forwardedPorts.length, 0); + }, overrides: { + Platform: () => osx, + }, testOn: 'posix'); + }); + group('logFilePath', () { testUsingContext('defaults to rooted from HOME', () { osx.environment['HOME'] = '/foo/bar';