Use directory exists instead of path.dirname (#112219)

diff --git a/packages/flutter_tools/lib/src/base/os.dart b/packages/flutter_tools/lib/src/base/os.dart
index f4d3a9f..ff43751 100644
--- a/packages/flutter_tools/lib/src/base/os.dart
+++ b/packages/flutter_tools/lib/src/base/os.dart
@@ -590,15 +590,15 @@
 String? findProjectRoot(FileSystem fileSystem, [ String? directory ]) {
   const String kProjectRootSentinel = 'pubspec.yaml';
   directory ??= fileSystem.currentDirectory.path;
+  Directory currentDirectory = fileSystem.directory(directory).absolute;
   while (true) {
-    if (fileSystem.isFileSync(fileSystem.path.join(directory!, kProjectRootSentinel))) {
-      return directory;
+    if (currentDirectory.childFile(kProjectRootSentinel).existsSync()) {
+      return currentDirectory.path;
     }
-    final String parent = fileSystem.path.dirname(directory);
-    if (directory == parent) {
+    if (!currentDirectory.existsSync() || currentDirectory.parent.path == currentDirectory.path) {
       return null;
     }
-    directory = parent;
+    currentDirectory = currentDirectory.parent;
   }
 }
 
diff --git a/packages/flutter_tools/lib/src/commands/build_aar.dart b/packages/flutter_tools/lib/src/commands/build_aar.dart
index e3145bf..95a4e14 100644
--- a/packages/flutter_tools/lib/src/commands/build_aar.dart
+++ b/packages/flutter_tools/lib/src/commands/build_aar.dart
@@ -155,6 +155,21 @@
     if (remainingArguments.isEmpty) {
       return FlutterProject.current();
     }
-    return FlutterProject.fromDirectory(globals.fs.directory(findProjectRoot(globals.fs, remainingArguments.first)));
+    final File mainFile = globals.fs.file(remainingArguments.first);
+    final String path;
+    if (!mainFile.existsSync()) {
+      final Directory pathProject = globals.fs.directory(remainingArguments.first);
+      if (!pathProject.existsSync()) {
+        throwToolExit('${remainingArguments.first} does not exist');
+      }
+      path = pathProject.path;
+    } else {
+      path = mainFile.parent.path;
+    }
+    final String? projectRoot = findProjectRoot(globals.fs, path);
+    if (projectRoot == null) {
+      throwToolExit('${mainFile.parent.path} is not a valid flutter project');
+    }
+    return FlutterProject.fromDirectory(globals.fs.directory(projectRoot));
   }
 }
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/pub_get_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/pub_get_test.dart
index 6861f22..e8b9db0 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/pub_get_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/pub_get_test.dart
@@ -114,6 +114,22 @@
     FileSystem: () => fileSystem,
   });
 
+  testUsingContext('pub get throws error on missing directory', () async {
+    final PackagesGetCommand command = PackagesGetCommand('get', false);
+    final CommandRunner<void> commandRunner = createTestCommandRunner(command);
+
+    try {
+      await commandRunner.run(<String>['get', 'missing_dir']);
+      fail('expected an exception');
+    } on Exception catch (e) {
+      expect(e.toString(), contains('Expected to find project root in missing_dir'));
+    }
+  }, overrides: <Type, Generator>{
+    Pub: () => pub,
+    ProcessManager: () => FakeProcessManager.any(),
+    FileSystem: () => fileSystem,
+  });
+
   testUsingContext('pub get triggers localizations generation when generate: true', () async {
     final File pubspecFile = fileSystem.currentDirectory.childFile('pubspec.yaml')
       ..createSync();
diff --git a/packages/flutter_tools/test/commands.shard/permeable/build_aar_test.dart b/packages/flutter_tools/test/commands.shard/permeable/build_aar_test.dart
index dceac21..087e656 100644
--- a/packages/flutter_tools/test/commands.shard/permeable/build_aar_test.dart
+++ b/packages/flutter_tools/test/commands.shard/permeable/build_aar_test.dart
@@ -230,6 +230,30 @@
       });
     });
 
+    group('throws ToolExit', () {
+      testUsingContext('main.dart not found', () async {
+        await expectLater(() async {
+          await runBuildAarCommand(
+            'missing_project',
+            arguments: <String>['--no-pub'],
+          );
+        }, throwsToolExit(
+          message: 'main.dart does not exist',
+        ));
+      });
+
+      testUsingContext('flutter project not valid', () async {
+        await expectLater(() async {
+          await runCommandIn(
+            tempDir.path,
+            arguments: <String>['--no-pub'],
+          );
+        }, throwsToolExit(
+          message: 'is not a valid flutter project',
+        ));
+      });
+    });
+
     testUsingContext('support ExtraDartFlagOptions', () async {
       final String projectPath = await createProject(tempDir,
           arguments: <String>['--no-pub', '--template=module']);