Add flutter pub package support and --link-to-remote to grinder (#2130)

* Add flutter support and --link-to-remote to grinder

* Add dependency check for requires-flutter
diff --git a/lib/src/package_meta.dart b/lib/src/package_meta.dart
index c6ba1bb..19d922d 100644
--- a/lib/src/package_meta.dart
+++ b/lib/src/package_meta.dart
@@ -317,7 +317,8 @@
 
   @override
   bool get requiresFlutter =>
-      _pubspec['environment']?.containsKey('flutter') == true;
+      _pubspec['environment']?.containsKey('flutter') == true ||
+      _pubspec['dependencies']?.containsKey('flutter') == true;
 
   @override
   FileContents getReadmeContents() {
diff --git a/tool/grind.dart b/tool/grind.dart
index 62d9c7e..c60df36 100644
--- a/tool/grind.dart
+++ b/tool/grind.dart
@@ -6,6 +6,7 @@
 import 'dart:io' hide ProcessException;
 
 import 'package:dartdoc/src/io_utils.dart';
+import 'package:dartdoc/src/package_meta.dart';
 import 'package:grinder/grinder.dart';
 import 'package:io/io.dart';
 import 'package:path/path.dart' as path;
@@ -759,17 +760,37 @@
       Directory(path.join(env['PUB_CACHE'], 'hosted', 'pub.dartlang.org'));
   Directory pubPackageDir =
       cache.listSync().firstWhere((e) => e.path.contains(pubPackageName));
-  await launcher.runStreamed('pub', ['get'],
-      workingDirectory: pubPackageDir.absolute.path);
-  await launcher.runStreamed(
-      Platform.resolvedExecutable,
-      [
-        '--enable-asserts',
-        path.join(Directory.current.absolute.path, 'bin', 'dartdoc.dart'),
-        '--json',
-        '--show-progress',
-      ]..addAll(dartdocParameters),
-      workingDirectory: pubPackageDir.absolute.path);
+  if (PackageMeta.fromDir(pubPackageDir).requiresFlutter) {
+    FlutterRepo flutterRepo =
+        await FlutterRepo.fromExistingFlutterRepo(await cleanFlutterRepo);
+    await launcher.runStreamed(flutterRepo.cachePub, ['get'],
+        environment: flutterRepo.env,
+        workingDirectory: pubPackageDir.absolute.path);
+    await launcher.runStreamed(
+        flutterRepo.cacheDart,
+        [
+          '--enable-asserts',
+          path.join(Directory.current.absolute.path, 'bin', 'dartdoc.dart'),
+          '--json',
+          '--link-to-remote',
+          '--show-progress',
+        ]..addAll(dartdocParameters),
+        environment: flutterRepo.env,
+        workingDirectory: pubPackageDir.absolute.path);
+  } else {
+    await launcher.runStreamed('pub', ['get'],
+        workingDirectory: pubPackageDir.absolute.path);
+    await launcher.runStreamed(
+        Platform.resolvedExecutable,
+        [
+          '--enable-asserts',
+          path.join(Directory.current.absolute.path, 'bin', 'dartdoc.dart'),
+          '--json',
+          '--link-to-remote',
+          '--show-progress',
+        ]..addAll(dartdocParameters),
+        workingDirectory: pubPackageDir.absolute.path);
+  }
   return path.join(pubPackageDir.absolute.path, 'doc', 'api');
 }