Fix DevFS to understand missing files in _stat() (#22844)

Fixes #22451
diff --git a/packages/flutter_tools/lib/src/devfs.dart b/packages/flutter_tools/lib/src/devfs.dart
index 1236186..5072b36 100644
--- a/packages/flutter_tools/lib/src/devfs.dart
+++ b/packages/flutter_tools/lib/src/devfs.dart
@@ -83,20 +83,32 @@
   void _stat() {
     if (_linkTarget != null) {
       // Stat the cached symlink target.
-      _fileStat = _linkTarget.statSync();
-      return;
+      final FileStat fileStat = _linkTarget.statSync();
+      if (fileStat.type == FileSystemEntityType.notFound) {
+        _linkTarget = null;
+      } else {
+        _fileStat = fileStat;
+        return;
+      }
     }
-    _fileStat = file.statSync();
-    if (_fileStat.type == FileSystemEntityType.link) {
+    final FileStat fileStat = file.statSync();
+    _fileStat = fileStat.type == FileSystemEntityType.notFound ? null : fileStat;
+    if (_fileStat != null && _fileStat.type == FileSystemEntityType.link) {
       // Resolve, stat, and maybe cache the symlink target.
       final String resolved = file.resolveSymbolicLinksSync();
       final FileSystemEntity linkTarget = fs.file(resolved);
       // Stat the link target.
-      _fileStat = linkTarget.statSync();
-      if (devFSConfig.cacheSymlinks) {
+      final FileStat fileStat = linkTarget.statSync();
+      if (fileStat.type == FileSystemEntityType.notFound) {
+        _fileStat = null;
+        _linkTarget = null;
+      } else if (devFSConfig.cacheSymlinks) {
         _linkTarget = linkTarget;
       }
     }
+    if (_fileStat == null) {
+      printError('Unable to get status of file "${file.path}": file not found.');
+    }
   }
 
   @override
@@ -106,21 +118,29 @@
   bool get isModified {
     final FileStat _oldFileStat = _fileStat;
     _stat();
-    return _oldFileStat == null || _fileStat.modified.isAfter(_oldFileStat.modified);
+    if (_oldFileStat == null && _fileStat == null)
+      return false;
+    return _oldFileStat == null || _fileStat == null || _fileStat.modified.isAfter(_oldFileStat.modified);
   }
 
   @override
   bool isModifiedAfter(DateTime time) {
     final FileStat _oldFileStat = _fileStat;
     _stat();
-    return _oldFileStat == null || time == null || _fileStat.modified.isAfter(time);
+    if (_oldFileStat == null && _fileStat == null)
+      return false;
+    return time == null
+        || _oldFileStat == null
+        || _fileStat == null
+        || _fileStat.modified.isAfter(time);
   }
 
   @override
   int get size {
     if (_fileStat == null)
       _stat();
-    return _fileStat.size;
+    // Can still be null if the file wasn't found.
+    return _fileStat?.size ?? 0;
   }
 
   @override