diff --git a/packages/flutter_tools/lib/src/platform_plugins.dart b/packages/flutter_tools/lib/src/platform_plugins.dart
index d41fa74..c3fb431 100644
--- a/packages/flutter_tools/lib/src/platform_plugins.dart
+++ b/packages/flutter_tools/lib/src/platform_plugins.dart
@@ -2,9 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// @dart = 2.8
-
-import 'package:meta/meta.dart';
 import 'package:yaml/yaml.dart';
 
 import 'base/common.dart';
@@ -35,11 +32,11 @@
 /// the [pluginClass] that will be the entry point to the plugin's native code.
 class AndroidPlugin extends PluginPlatform {
   AndroidPlugin({
-    @required this.name,
-    @required this.package,
-    @required this.pluginClass,
-    @required this.pluginPath,
-    @required FileSystem fileSystem,
+    required this.name,
+    required this.package,
+    required this.pluginClass,
+    required this.pluginPath,
+    required FileSystem fileSystem,
   }) : _fileSystem = fileSystem;
 
   factory AndroidPlugin.fromYaml(String name, YamlMap yaml, String pluginPath, FileSystem fileSystem) {
@@ -88,7 +85,7 @@
     };
   }
 
-  Set<String> _cachedEmbeddingVersion;
+  Set<String>? _cachedEmbeddingVersion;
 
   /// Returns the version of the Android embedding.
   Set<String> get _supportedEmbedings => _cachedEmbeddingVersion ??= _getSupportedEmbeddings();
@@ -118,7 +115,7 @@
       )
     ];
 
-    File mainPluginClass;
+    File? mainPluginClass;
     bool mainClassFound = false;
     for (final String mainClassCandidate in mainClassCandidates) {
       mainPluginClass = _fileSystem.file(mainClassCandidate);
@@ -127,7 +124,7 @@
         break;
       }
     }
-    if (!mainClassFound) {
+    if (mainPluginClass == null || !mainClassFound) {
       assert(mainClassCandidates.length <= 2);
       throwToolExit(
         "The plugin `$name` doesn't have a main class defined in ${mainClassCandidates.join(' or ')}. "
@@ -158,9 +155,9 @@
 /// will be the entry point to the plugin's native code.
 class IOSPlugin extends PluginPlatform {
   const IOSPlugin({
-    @required this.name,
-    this.classPrefix,
-    @required this.pluginClass,
+    required this.name,
+    required this.classPrefix,
+    required this.pluginClass,
   });
 
   factory IOSPlugin.fromYaml(String name, YamlMap yaml) {
@@ -204,7 +201,7 @@
 /// [pluginClass] will be the entry point to the plugin's native code.
 class MacOSPlugin extends PluginPlatform implements NativeOrDartPlugin {
   const MacOSPlugin({
-    @required this.name,
+    required this.name,
     this.pluginClass,
     this.dartPluginClass,
   });
@@ -212,7 +209,7 @@
   factory MacOSPlugin.fromYaml(String name, YamlMap yaml) {
     assert(validate(yaml));
     // Treat 'none' as not present. See https://github.com/flutter/flutter/issues/57497.
-    String pluginClass = yaml[kPluginClass] as String;
+    String? pluginClass = yaml[kPluginClass] as String;
     if (pluginClass == 'none') {
       pluginClass = null;
     }
@@ -233,8 +230,8 @@
   static const String kConfigKey = 'macos';
 
   final String name;
-  final String pluginClass;
-  final String dartPluginClass;
+  final String? pluginClass;
+  final String? dartPluginClass;
 
   @override
   bool isNative() => pluginClass != null;
@@ -255,7 +252,7 @@
 /// [pluginClass] will be the entry point to the plugin's native code.
 class WindowsPlugin extends PluginPlatform implements NativeOrDartPlugin{
   const WindowsPlugin({
-    @required this.name,
+    required this.name,
     this.pluginClass,
     this.dartPluginClass,
   }) : assert(pluginClass != null || dartPluginClass != null);
@@ -263,7 +260,7 @@
   factory WindowsPlugin.fromYaml(String name, YamlMap yaml) {
     assert(validate(yaml));
     // Treat 'none' as not present. See https://github.com/flutter/flutter/issues/57497.
-    String pluginClass = yaml[kPluginClass] as String;
+    String? pluginClass = yaml[kPluginClass] as String;
     if (pluginClass == 'none') {
       pluginClass = null;
     }
@@ -284,8 +281,8 @@
   static const String kConfigKey = 'windows';
 
   final String name;
-  final String pluginClass;
-  final String dartPluginClass;
+  final String? pluginClass;
+  final String? dartPluginClass;
 
   @override
   bool isNative() => pluginClass != null;
@@ -295,7 +292,7 @@
     return <String, dynamic>{
       'name': name,
       if (pluginClass != null) 'class': pluginClass,
-      if (pluginClass != null) 'filename': _filenameForCppClass(pluginClass),
+      if (pluginClass != null) 'filename': _filenameForCppClass(pluginClass!),
       if (dartPluginClass != null) 'dartPluginClass': dartPluginClass,
     };
   }
@@ -307,7 +304,7 @@
 /// [pluginClass] will be the entry point to the plugin's native code.
 class LinuxPlugin extends PluginPlatform implements NativeOrDartPlugin {
   const LinuxPlugin({
-    @required this.name,
+    required this.name,
     this.pluginClass,
     this.dartPluginClass,
   }) : assert(pluginClass != null || dartPluginClass != null);
@@ -315,7 +312,7 @@
   factory LinuxPlugin.fromYaml(String name, YamlMap yaml) {
     assert(validate(yaml));
     // Treat 'none' as not present. See https://github.com/flutter/flutter/issues/57497.
-    String pluginClass = yaml[kPluginClass] as String;
+    String? pluginClass = yaml[kPluginClass] as String;
     if (pluginClass == 'none') {
       pluginClass = null;
     }
@@ -336,8 +333,8 @@
   static const String kConfigKey = 'linux';
 
   final String name;
-  final String pluginClass;
-  final String dartPluginClass;
+  final String? pluginClass;
+  final String? dartPluginClass;
 
   @override
   bool isNative() => pluginClass != null;
@@ -347,7 +344,7 @@
     return <String, dynamic>{
       'name': name,
       if (pluginClass != null) 'class': pluginClass,
-      if (pluginClass != null) 'filename': _filenameForCppClass(pluginClass),
+      if (pluginClass != null) 'filename': _filenameForCppClass(pluginClass!),
       if (dartPluginClass != null) 'dartPluginClass': dartPluginClass,
     };
   }
@@ -360,9 +357,9 @@
 /// containing the code.
 class WebPlugin extends PluginPlatform {
   const WebPlugin({
-    @required this.name,
-    @required this.pluginClass,
-    @required this.fileName,
+    required this.name,
+    required this.pluginClass,
+    required this.fileName,
   });
 
   factory WebPlugin.fromYaml(String name, YamlMap yaml) {
