check if directory exists before listing content (#119748)

diff --git a/packages/flutter_tools/lib/src/cache.dart b/packages/flutter_tools/lib/src/cache.dart
index 356618e..c4ecd3d 100644
--- a/packages/flutter_tools/lib/src/cache.dart
+++ b/packages/flutter_tools/lib/src/cache.dart
@@ -1242,6 +1242,10 @@
         continue;
       }
       for (Directory directory = file.parent; directory.absolute.path != _tempStorage.absolute.path; directory = directory.parent) {
+        // Handle race condition when the directory is deleted before this step
+        if (!directory.existsSync()) {
+          break;
+        }
         if (directory.listSync().isNotEmpty) {
           break;
         }
diff --git a/packages/flutter_tools/test/general.shard/cache_test.dart b/packages/flutter_tools/test/general.shard/cache_test.dart
index c6628f1..3dc6e7f 100644
--- a/packages/flutter_tools/test/general.shard/cache_test.dart
+++ b/packages/flutter_tools/test/general.shard/cache_test.dart
@@ -398,6 +398,30 @@
     expect(staleFile, isNot(exists));
   });
 
+  testWithoutContext('Try to remove without a parent', () async {
+    final FileSystem fileSystem = MemoryFileSystem.test();
+    final Directory parent = fileSystem.directory('dir');
+    parent.createSync();
+    final Directory child = parent.childDirectory('child');
+    child.createSync();
+    final Directory tempStorage = parent.childDirectory('temp');
+    tempStorage.createSync();
+    final FakeArtifactUpdaterDownload fakeArtifact = FakeArtifactUpdaterDownload(
+      operatingSystemUtils: FakeOperatingSystemUtils(),
+      logger: BufferLogger.test(),
+      fileSystem: fileSystem,
+      tempStorage: tempStorage,
+      httpClient: HttpClient(),
+      platform: FakePlatform(),
+      allowedBaseUrls: <String>[]
+    );
+    final File file = child.childFile('file');
+    file.createSync();
+    fakeArtifact.addFiles(<File>[file]);
+    child.deleteSync(recursive: true);
+    fakeArtifact.removeDownloadedFiles();
+  });
+
   testWithoutContext('IosUsbArtifacts verifies executables for libimobiledevice in isUpToDateInner', () async {
     final FileSystem fileSystem = MemoryFileSystem.test();
     final Cache cache = Cache.test(fileSystem: fileSystem, processManager: FakeProcessManager.any());
@@ -1212,3 +1236,19 @@
   @override
   void removeDownloadedFiles() { }
 }
+
+class FakeArtifactUpdaterDownload extends ArtifactUpdater {
+  FakeArtifactUpdaterDownload({
+    required super.operatingSystemUtils,
+    required super.logger,
+    required super.fileSystem,
+    required super.tempStorage,
+    required super.httpClient,
+    required super.platform,
+    required super.allowedBaseUrls
+  });
+
+  void addFiles(List<File> files) {
+    downloadedFiles.addAll(files);
+  }
+}