diff --git a/protoc_plugin/bin/protoc_plugin.dart b/protoc_plugin/bin/protoc_plugin.dart
index 8e45871..54da34c 100755
--- a/protoc_plugin/bin/protoc_plugin.dart
+++ b/protoc_plugin/bin/protoc_plugin.dart
@@ -3,8 +3,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 import 'dart:io';
 
 import 'package:protoc_plugin/protoc.dart';
diff --git a/protoc_plugin/bin/protoc_plugin_bazel.dart b/protoc_plugin/bin/protoc_plugin_bazel.dart
index 843239e..ce74938 100755
--- a/protoc_plugin/bin/protoc_plugin_bazel.dart
+++ b/protoc_plugin/bin/protoc_plugin_bazel.dart
@@ -3,8 +3,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 import 'dart:io';
 
 import 'package:protoc_plugin/bazel.dart';
diff --git a/protoc_plugin/lib/names.dart b/protoc_plugin/lib/names.dart
index a209443..170fb0b 100644
--- a/protoc_plugin/lib/names.dart
+++ b/protoc_plugin/lib/names.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 import 'dart:math' as math;
 
 import 'package:protobuf/meta.dart';
@@ -24,11 +22,15 @@
 
   /// The index of this field in MessageGenerator.fieldList.
   /// The same index will be stored in FieldInfo.index.
-  final int index;
+  ///
+  /// `null` for extensions.
+  final int? index;
 
   /// The position of this field as it appeared in the original DescriptorProto.
   /// Used to construct metadata.
-  final int sourcePosition;
+  ///
+  /// `null` for extensions.
+  final int? sourcePosition;
 
   /// Identifier for generated getters/setters.
   final String fieldName;
@@ -36,17 +38,17 @@
   /// Identifier for the generated hasX() method, without braces.
   ///
   /// `null` for repeated fields.
-  final String hasMethodName;
+  final String? hasMethodName;
 
   /// Identifier for the generated clearX() method, without braces.
   ///
   /// `null` for repeated fields.
-  final String clearMethodName;
+  final String? clearMethodName;
 
   // Identifier for the generated ensureX() method, without braces.
   //
-  //'null' for scalar, repeated, and map fields.
-  final String ensureMethodName;
+  // 'null' for scalar, repeated, and map fields.
+  final String? ensureMethodName;
 
   FieldNames(this.descriptor, this.index, this.sourcePosition, this.fieldName,
       {this.hasMethodName, this.clearMethodName, this.ensureMethodName});
@@ -158,7 +160,7 @@
 /// The returned name is that, which will generate the accepted variants.
 String disambiguateName(
     String name, Set<String> usedNames, Iterable<String> suffixes,
-    {List<String> Function(String candidate) generateVariants}) {
+    {List<String> Function(String candidate)? generateVariants}) {
   generateVariants ??= (String name) => <String>[name];
 
   bool allVariantsAvailable(List<String> variants) {
@@ -259,21 +261,19 @@
     indexes[field.name] = index;
   }
 
-  var existingNames = <String>{}
-    ..addAll(reservedMemberNames)
-    ..addAll(reserved);
+  var existingNames = <String>{...reservedMemberNames, ...reserved};
 
-  var fieldNames = List<FieldNames>.filled(indexes.length, null);
+  var fieldNames = List<FieldNames?>.filled(indexes.length, null);
 
   void takeFieldNames(FieldNames chosen) {
-    fieldNames[chosen.index] = chosen;
+    fieldNames[chosen.index!] = chosen;
 
     existingNames.add(chosen.fieldName);
     if (chosen.hasMethodName != null) {
-      existingNames.add(chosen.hasMethodName);
+      existingNames.add(chosen.hasMethodName!);
     }
     if (chosen.clearMethodName != null) {
-      existingNames.add(chosen.clearMethodName);
+      existingNames.add(chosen.clearMethodName!);
     }
   }
 
@@ -281,17 +281,17 @@
   // They have higher priority than automatically chosen names.
   // Explicitly setting a name that's already taken is a build error.
   for (var field in sorted) {
-    if (_nameOption(field).isNotEmpty) {
+    if (_nameOption(field)!.isNotEmpty) {
       takeFieldNames(_memberNamesFromOption(descriptor, field,
-          indexes[field.name], sourcePositions[field.name], existingNames));
+          indexes[field.name]!, sourcePositions[field.name]!, existingNames));
     }
   }
 
   // Then do other fields.
   // They are automatically renamed until we find something unused.
   for (var field in sorted) {
-    if (_nameOption(field).isEmpty) {
-      var index = indexes[field.name];
+    if (_nameOption(field)!.isEmpty) {
+      var index = indexes[field.name]!;
       var sourcePosition = sourcePositions[field.name];
       takeFieldNames(
           _unusedMemberNames(field, index, sourcePosition, existingNames));
@@ -302,16 +302,9 @@
 
   void takeOneofNames(OneofNames chosen) {
     oneofNames.add(chosen);
-
-    if (chosen.whichOneofMethodName != null) {
-      existingNames.add(chosen.whichOneofMethodName);
-    }
-    if (chosen.clearMethodName != null) {
-      existingNames.add(chosen.clearMethodName);
-    }
-    if (chosen.byTagMapName != null) {
-      existingNames.add(chosen.byTagMapName);
-    }
+    existingNames.add(chosen.whichOneofMethodName);
+    existingNames.add(chosen.clearMethodName);
+    existingNames.add(chosen.byTagMapName);
   }
 
   List<String> oneofNameVariants(String name) {
@@ -336,7 +329,7 @@
         _defaultWhichMethodName(oneofName), oneofEnumName, enumMapName));
   }
 
-  return MemberNames(fieldNames, oneofNames);
+  return MemberNames(fieldNames.cast<FieldNames>(), oneofNames);
 }
 
 /// Chooses the member names for a field that has the 'dart_name' option.
@@ -359,7 +352,7 @@
     }
   }
 
-  var name = _nameOption(field);
+  var name = _nameOption(field)!;
   if (name.isEmpty) {
     throw ArgumentError("field doesn't have dart_name option");
   }
@@ -379,7 +372,7 @@
   var clearMethod = 'clear${_capitalize(name)}';
   checkAvailable(clearMethod);
 
-  String ensureMethod;
+  String? ensureMethod;
 
   if (_isGroupOrMessage(field)) {
     ensureMethod = 'ensure${_capitalize(name)}';
@@ -399,8 +392,8 @@
   }
 }
 
-FieldNames _unusedMemberNames(FieldDescriptorProto field, int index,
-    int sourcePosition, Set<String> existingNames) {
+FieldNames _unusedMemberNames(FieldDescriptorProto field, int? index,
+    int? sourcePosition, Set<String> existingNames) {
   if (_isRepeated(field)) {
     return FieldNames(
         field,
@@ -454,7 +447,7 @@
 /// The suffix to use for this field in Dart method names.
 /// (It should be camelcase and begin with an uppercase letter.)
 String _fieldMethodSuffix(FieldDescriptorProto field) {
-  var name = _nameOption(field);
+  var name = _nameOption(field)!;
   if (name.isNotEmpty) return _capitalize(name);
 
   if (field.type != FieldDescriptorProto_Type.TYPE_GROUP) {
@@ -483,8 +476,8 @@
     field.type == FieldDescriptorProto_Type.TYPE_MESSAGE ||
     field.type == FieldDescriptorProto_Type.TYPE_GROUP;
 
-String _nameOption(FieldDescriptorProto field) =>
-    field.options.getExtension(Dart_options.dartName) as String;
+String? _nameOption(FieldDescriptorProto field) =>
+    field.options.getExtension(Dart_options.dartName) as String?;
 
 bool _isDartFieldName(String name) => name.startsWith(_dartFieldNameExpr);
 
diff --git a/protoc_plugin/lib/protoc.dart b/protoc_plugin/lib/protoc.dart
index cba09b7..f6001b3 100644
--- a/protoc_plugin/lib/protoc.dart
+++ b/protoc_plugin/lib/protoc.dart
@@ -1,5 +1,3 @@
-// @dart=2.11
-
 import 'dart:convert';
 
 import 'package:dart_style/dart_style.dart';
diff --git a/protoc_plugin/lib/src/base_type.dart b/protoc_plugin/lib/src/base_type.dart
index f9326da..4721566 100644
--- a/protoc_plugin/lib/src/base_type.dart
+++ b/protoc_plugin/lib/src/base_type.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 part of '../protoc.dart';
 
 /// Represents the base type of a particular field in a proto definition.
@@ -19,11 +17,11 @@
   final String typeConstantSuffix;
 
   // Method name of the setter method for this type.
-  final String setter;
+  final String? setter;
 
   // The generator corresponding to this type.
   // (Null for primitive types.)
-  final ProtobufContainer generator;
+  final ProtobufContainer? generator;
 
   const BaseType._raw(this.descriptor, this.typeConstantSuffix, this.unprefixed,
       this.setter, this.generator);
@@ -37,12 +35,12 @@
 
   /// The package where this type is declared.
   /// (Always the empty string for primitive types.)
-  String get package => generator == null ? '' : generator.package;
+  String get package => generator == null ? '' : generator!.package;
 
   /// The Dart expression to use for this type when in a different file.
   String get prefixed => generator == null
       ? unprefixed
-      : generator.fileImportPrefix + '.' + unprefixed;
+      : generator!.fileImportPrefix + '.' + unprefixed;
 
   /// Returns the name to use in generated code for this Dart type.
   ///
@@ -135,6 +133,6 @@
     }
 
     return BaseType._raw(
-        field.type, constSuffix, generator.classname, null, generator);
+        field.type, constSuffix, generator.classname!, null, generator);
   }
 }
diff --git a/protoc_plugin/lib/src/client_generator.dart b/protoc_plugin/lib/src/client_generator.dart
index 500c0c9..8fa0374 100644
--- a/protoc_plugin/lib/src/client_generator.dart
+++ b/protoc_plugin/lib/src/client_generator.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 part of '../protoc.dart';
 
 class ClientApiGenerator {
diff --git a/protoc_plugin/lib/src/code_generator.dart b/protoc_plugin/lib/src/code_generator.dart
index 9b900ea..1d93559 100644
--- a/protoc_plugin/lib/src/code_generator.dart
+++ b/protoc_plugin/lib/src/code_generator.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 import 'dart:io';
 
 import 'package:fixnum/fixnum.dart';
@@ -23,7 +21,7 @@
   static int _idx = 0;
 
   String get package;
-  String get classname;
+  String? get classname;
   String get fullName;
 
   /// The field path contains the field IDs and indices (for repeated fields)
@@ -32,7 +30,7 @@
   /// the message in question.
   /// For more information see
   /// https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/descriptor.proto#L728
-  List<int> get fieldPath;
+  List<int>? get fieldPath;
 
   /// The fully qualified name with a leading '.'.
   ///
@@ -42,12 +40,12 @@
   String get fileImportPrefix => _getFileImportPrefix();
 
   String get binaryDescriptorName =>
-      '${lowerCaseFirstLetter(classname)}Descriptor';
+      '${lowerCaseFirstLetter(classname!)}Descriptor';
 
   String _getFileImportPrefix() {
-    var path = fileGen.protoFileUri.toString();
+    var path = fileGen!.protoFileUri.toString();
     if (_importPrefixes.containsKey(path)) {
-      return _importPrefixes[path];
+      return _importPrefixes[path]!;
     }
     final alias = '\$$_idx';
     _importPrefixes[path] = alias;
@@ -58,21 +56,21 @@
   /// The generator of the .pb.dart file defining this entity.
   ///
   /// (Represents the .pb.dart file that we need to import in order to use it.)
-  FileGenerator get fileGen;
+  FileGenerator? get fileGen;
 
   // The generator containing this entity.
-  ProtobufContainer get parent;
+  ProtobufContainer? get parent;
 
   /// The top-level parent of this entity. If this entity is a top-level entity,
   /// returns this.
-  ProtobufContainer get toplevelParent {
+  ProtobufContainer? get toplevelParent {
     if (parent == null) {
       return null;
     }
     if (parent is FileGenerator) {
       return this;
     }
-    return parent.toplevelParent;
+    return parent?.toplevelParent;
   }
 }
 
@@ -88,10 +86,8 @@
   /// generated files are created and how imports between generated files are
   /// constructed (see [OutputConfiguration] for details).
   void generate(
-      {Map<String, SingleOptionParser> optionParsers,
-      OutputConfiguration config}) {
-    config ??= DefaultOutputConfiguration();
-
+      {Map<String, SingleOptionParser>? optionParsers,
+      OutputConfiguration config = const DefaultOutputConfiguration()}) {
     var extensions = ExtensionRegistry();
     Dart_options.registerAllExtensions(extensions);
 
@@ -136,14 +132,19 @@
 
   @override
   String get package => '';
+
   @override
-  String get classname => null;
+  String? get classname => null;
+
   @override
   String get fullName => '';
+
   @override
-  FileGenerator get fileGen => null;
+  FileGenerator? get fileGen => null;
+
   @override
-  ProtobufContainer get parent => null;
+  ProtobufContainer? get parent => null;
+
   @override
-  List<int> get fieldPath => [];
+  List<int>? get fieldPath => [];
 }
diff --git a/protoc_plugin/lib/src/enum_generator.dart b/protoc_plugin/lib/src/enum_generator.dart
index 2b3da04..b1159ce 100644
--- a/protoc_plugin/lib/src/enum_generator.dart
+++ b/protoc_plugin/lib/src/enum_generator.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 part of '../protoc.dart';
 
 class EnumAlias {
@@ -14,11 +12,14 @@
 
 class EnumGenerator extends ProtobufContainer {
   @override
-  final ProtobufContainer parent;
+  final ProtobufContainer? parent;
+
   @override
-  final String classname;
+  final String? classname;
+
   @override
   final String fullName;
+
   final EnumDescriptorProto _descriptor;
   final List<EnumValueDescriptorProto> _canonicalValues =
       <EnumValueDescriptorProto>[];
@@ -28,20 +29,19 @@
   /// Maps the name of an enum value to the Dart name we will use for it.
   final Map<String, String> dartNames = <String, String>{};
   final List<int> _originalAliasIndices = <int>[];
-  List<int> _fieldPath;
+  List<int>? _fieldPath;
   final List<int> _fieldPathSegment;
 
   /// See [[ProtobufContainer]
   @override
-  List<int> get fieldPath =>
-      _fieldPath ??= List.from(parent.fieldPath)..addAll(_fieldPathSegment);
+  List<int>? get fieldPath =>
+      _fieldPath ??= List.from(parent!.fieldPath!)..addAll(_fieldPathSegment);
 
   EnumGenerator._(EnumDescriptorProto descriptor, this.parent,
       Set<String> usedClassNames, int repeatedFieldIndex, int fieldIdTag)
-      : assert(parent != null),
-        _fieldPathSegment = [fieldIdTag, repeatedFieldIndex],
+      : _fieldPathSegment = [fieldIdTag, repeatedFieldIndex],
         classname = messageOrEnumClassName(descriptor.name, usedClassNames,
-            parent: parent?.classname ?? ''),
+            parent: parent!.classname ?? ''),
         fullName = parent.fullName == ''
             ? descriptor.name
             : '${parent.fullName}.${descriptor.name}',
@@ -80,9 +80,10 @@
             _nestedFieldTag);
 
   @override
-  String get package => parent.package;
+  String get package => parent!.package;
+
   @override
-  FileGenerator get fileGen => parent.fileGen;
+  FileGenerator? get fileGen => parent!.fileGen;
 
   /// Make this enum available as a field type.
   void register(GenerationContext ctx) {
@@ -93,7 +94,7 @@
   /// [usage] represents the .pb.dart file where the expression will be used.
   String getJsonConstant(FileGenerator usage) {
     var name = '$classname\$json';
-    if (usage.protoFileUri == fileGen.protoFileUri) {
+    if (usage.protoFileUri == fileGen!.protoFileUri) {
       return name;
     }
     return '$fileImportPrefix.$name';
@@ -106,13 +107,15 @@
         'class $classname extends $protobufImportPrefix.ProtobufEnum {',
         '}\n', [
       NamedLocation(
-          name: classname, fieldPathSegment: fieldPath, start: 'class '.length)
+          name: classname!,
+          fieldPathSegment: fieldPath!,
+          start: 'class '.length)
     ], () {
       // -----------------------------------------------------------------
       // Define enum types.
       for (var i = 0; i < _canonicalValues.length; i++) {
         var val = _canonicalValues[i];
-        final name = dartNames[val.name];
+        final name = dartNames[val.name]!;
         final conditionalValName = configurationDependent(
             'protobuf.omit_enum_names', quoted(val.name));
         out.printlnAnnotated(
@@ -121,7 +124,7 @@
             [
               NamedLocation(
                   name: name,
-                  fieldPathSegment: List.from(fieldPath)
+                  fieldPathSegment: List.from(fieldPath!)
                     ..addAll([_enumValueTag, _originalCanonicalIndices[i]]),
                   start: 'static const $classname '.length)
             ]);
@@ -130,14 +133,14 @@
         out.println();
         for (var i = 0; i < _aliases.length; i++) {
           var alias = _aliases[i];
-          final name = dartNames[alias.value.name];
+          final name = dartNames[alias.value.name]!;
           out.printlnAnnotated(
               'static const $classname $name ='
               ' ${dartNames[alias.canonicalValue.name]};',
               [
                 NamedLocation(
                     name: name,
-                    fieldPathSegment: List.from(fieldPath)
+                    fieldPathSegment: List.from(fieldPath!)
                       ..addAll([_enumValueTag, _originalAliasIndices[i]]),
                     start: 'static const $classname '.length)
               ]);
@@ -169,11 +172,11 @@
 
   /// Writes a Dart constant containing the JSON for the EnumProtoDescriptor.
   void generateConstants(IndentingWriter out) {
-    var name = getJsonConstant(fileGen);
+    var name = getJsonConstant(fileGen!);
     var json = _descriptor.writeToJsonMap();
 
     out.println('@$coreImportPrefix.Deprecated'
-        '(\'Use ${toplevelParent.binaryDescriptorName} instead\')');
+        '(\'Use ${toplevelParent!.binaryDescriptorName} instead\')');
     out.print('const $name = ');
     writeJsonConst(out, json);
     out.println(';');
diff --git a/protoc_plugin/lib/src/extension_generator.dart b/protoc_plugin/lib/src/extension_generator.dart
index 05e9455..295100f 100644
--- a/protoc_plugin/lib/src/extension_generator.dart
+++ b/protoc_plugin/lib/src/extension_generator.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 part of '../protoc.dart';
 
 class ExtensionGenerator {
@@ -11,15 +9,15 @@
   final ProtobufContainer _parent;
 
   // populated by resolve()
-  ProtobufField _field;
+  late ProtobufField _field;
+  bool _resolved = false;
   final String _extensionName;
   String _extendedFullName = '';
-  List<int> _fieldPath;
   final List<int> _fieldPathSegment;
 
   /// See [[ProtobufContainer]
-  List<int> get fieldPath =>
-      _fieldPath ??= List.from(_parent.fieldPath)..addAll(_fieldPathSegment);
+  late final List<int> fieldPath = List.from(_parent.fieldPath!)
+    ..addAll(_fieldPathSegment);
 
   ExtensionGenerator._(this._descriptor, this._parent, Set<String> usedNames,
       int repeatedFieldIndex, int fieldIdTag)
@@ -40,6 +38,7 @@
 
   void resolve(GenerationContext ctx) {
     _field = ProtobufField.extension(_descriptor, _parent, ctx);
+    _resolved = true;
 
     var extendedType = ctx.getFieldType(_descriptor.extendee);
     // TODO(skybrian) When would this be null?
@@ -51,16 +50,16 @@
   String get package => _parent.package;
 
   /// The generator of the .pb.dart file where this extension will be defined.
-  FileGenerator get fileGen => _parent.fileGen;
+  FileGenerator? get fileGen => _parent.fileGen;
 
   String get name {
-    if (_field == null) throw StateError('resolve not called');
+    if (!_resolved) throw StateError('resolve not called');
     var name = _extensionName;
     return _parent is MessageGenerator ? '${_parent.classname}.$name' : name;
   }
 
   bool get needsFixnumImport {
-    if (_field == null) throw StateError('resolve not called');
+    if (!_resolved) throw StateError('resolve not called');
     return _field.needsFixnumImport;
   }
 
@@ -70,16 +69,16 @@
   /// add its generator.
   void addImportsTo(
       Set<FileGenerator> imports, Set<FileGenerator> enumImports) {
-    if (_field == null) throw StateError('resolve not called');
+    if (!_resolved) throw StateError('resolve not called');
     var typeGen = _field.baseType.generator;
     if (typeGen != null) {
       // The type of this extension is defined in a different file,
       // so we need to import it.
       if (typeGen is EnumGenerator) {
         // Enums are always in a different file.
-        enumImports.add(typeGen.fileGen);
+        enumImports.add(typeGen.fileGen!);
       } else if (typeGen.fileGen != fileGen) {
-        imports.add(typeGen.fileGen);
+        imports.add(typeGen.fileGen!);
       }
     }
   }
@@ -87,18 +86,18 @@
   /// For each .pb.dart file that the generated code needs to import,
   /// add its generator.
   void addConstantImportsTo(Set<FileGenerator> imports) {
-    if (_field == null) throw StateError('resolve not called');
+    if (!_resolved) throw StateError('resolve not called');
     // No dependencies - nothing to do.
   }
 
   void generate(IndentingWriter out) {
-    if (_field == null) throw StateError('resolve not called');
+    if (!_resolved) throw StateError('resolve not called');
 
     var name = _extensionName;
     final conditionalName = configurationDependent(
         'protobuf.omit_field_names', quoted(_extensionName));
     var type = _field.baseType;
-    var dartType = type.getDartType(fileGen);
+    var dartType = type.getDartType(fileGen!);
     final conditionalExtendedName = configurationDependent(
         'protobuf.omit_message_names', quoted(_extendedFullName));
 
@@ -109,7 +108,7 @@
     positionals.add('${_field.number}');
     positionals.add(_field.typeConstant);
 
-    var named = <String, String>{};
+    var named = <String, String?>{};
     named['protoName'] = _field.quotedProtoName;
     if (_field.isRepeated) {
       invocation = '$protobufImportPrefix.Extension<$dartType>.repeated';
@@ -123,16 +122,15 @@
       }
     } else {
       invocation = '$protobufImportPrefix.Extension<$dartType>';
-      named['defaultOrMaker'] = _field.generateDefaultFunction(fileGen);
+      named['defaultOrMaker'] = _field.generateDefaultFunction(fileGen!);
       if (type.isMessage || type.isGroup) {
         named['subBuilder'] = '$dartType.create';
       } else if (type.isEnum) {
-        var dartEnum = type.getDartType(fileGen);
+        var dartEnum = type.getDartType(fileGen!);
         named['valueOf'] = '$dartEnum.valueOf';
         named['enumValues'] = '$dartEnum.values';
       }
     }
-    assert(invocation != null);
     var fieldDefinition = 'static final ';
     out.printAnnotated(
         '$fieldDefinition$name = '
diff --git a/protoc_plugin/lib/src/file_generator.dart b/protoc_plugin/lib/src/file_generator.dart
index bada58e..ebe141e 100644
--- a/protoc_plugin/lib/src/file_generator.dart
+++ b/protoc_plugin/lib/src/file_generator.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 part of '../protoc.dart';
 
 final _dartIdentifier = RegExp(r'^\w+$');
@@ -91,16 +89,16 @@
           throw mixinError('Cycle in parent chain: $cycle');
         }
         parentChain.add(parentName);
-        currentMixin = dartMixins[parentName];
+        currentMixin = dartMixins[parentName]!;
       }
     }
 
     // Turn DartMixins into PbMixins.
     final pbMixins = <String, PbMixin>{};
-    PbMixin resolveMixin(String name) {
+    PbMixin? resolveMixin(String name) {
       if (pbMixins.containsKey(name)) return pbMixins[name];
       if (dartMixins.containsKey(name)) {
-        var dartMixin = dartMixins[name];
+        var dartMixin = dartMixins[name]!;
         var pbMixin = PbMixin(dartMixin.name,
             importFrom: dartMixin.importFrom,
             parent: resolveMixin(dartMixin.parent));
@@ -154,7 +152,7 @@
 
     var declaredMixins = _getDeclaredMixins(descriptor);
     var defaultMixinName =
-        descriptor.options?.getExtension(Dart_options.defaultMixin) as String ??
+        descriptor.options.getExtension(Dart_options.defaultMixin) as String? ??
             '';
     var defaultMixin =
         declaredMixins[defaultMixinName] ?? findMixin(defaultMixinName);
@@ -206,14 +204,19 @@
 
   @override
   String get package => descriptor.package;
+
   @override
   String get classname => '';
+
   @override
   String get fullName => descriptor.package;
+
   @override
   FileGenerator get fileGen => this;
+
   @override
-  ProtobufContainer get parent => null;
+  ProtobufContainer? get parent => null;
+
   @override
   List<int> get fieldPath => [];
 
diff --git a/protoc_plugin/lib/src/grpc_generator.dart b/protoc_plugin/lib/src/grpc_generator.dart
index 73fe67e..dd936aa 100644
--- a/protoc_plugin/lib/src/grpc_generator.dart
+++ b/protoc_plugin/lib/src/grpc_generator.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 part of '../protoc.dart';
 
 class GrpcServiceGenerator {
@@ -24,13 +22,13 @@
   final _undefinedDeps = <String, String>{};
 
   /// Fully-qualified gRPC service name.
-  String _fullServiceName;
+  late final String _fullServiceName;
 
   /// Dart class name for client stub.
-  String _clientClassname;
+  late final String _clientClassname;
 
   /// Dart class name for server stub.
-  String _serviceClassname;
+  late final String _serviceClassname;
 
   /// List of gRPC methods.
   final _methods = <_GrpcMethod>[];
@@ -39,7 +37,7 @@
     final name = _descriptor.name;
     final package = fileGen.package;
 
-    if (package != null && package.isNotEmpty) {
+    if (package.isNotEmpty) {
       _fullServiceName = '$package.$name';
     } else {
       _fullServiceName = name;
@@ -69,7 +67,7 @@
   void _addDependency(GenerationContext ctx, String fqname, String location) {
     if (_deps.containsKey(fqname)) return; // Already added.
 
-    final mg = ctx.getFieldType(fqname) as MessageGenerator;
+    final mg = ctx.getFieldType(fqname) as MessageGenerator?;
     if (mg == null) {
       _undefinedDeps[fqname] = location;
       return;
diff --git a/protoc_plugin/lib/src/linker.dart b/protoc_plugin/lib/src/linker.dart
index 740e719..ef99f9f 100644
--- a/protoc_plugin/lib/src/linker.dart
+++ b/protoc_plugin/lib/src/linker.dart
@@ -2,14 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 import '../protoc.dart' show FileGenerator;
 import 'code_generator.dart';
 import 'options.dart';
 
 /// Resolves all cross-references in a set of proto files.
-void link(GenerationOptions options, Iterable<FileGenerator> files) {
+void link(GenerationOptions? options, Iterable<FileGenerator> files) {
   var ctx = GenerationContext(options);
 
   // Register the targets of cross-references.
@@ -41,7 +39,7 @@
 }
 
 class GenerationContext {
-  final GenerationOptions options;
+  final GenerationOptions? options;
 
   /// The files available for import.
   final Map<String, FileGenerator> _files = <String, FileGenerator>{};
@@ -67,9 +65,9 @@
 
   /// Returns info about a .pb.dart being imported,
   /// based on the filename given to us by protoc.
-  FileGenerator getImportedProtoFile(String name) => _files[name];
+  FileGenerator? getImportedProtoFile(String name) => _files[name];
 
   /// Returns info about the type of a message, group, or enum field,
   /// based on the fully qualified name given to us by protoc.
-  ProtobufContainer getFieldType(String name) => _typeRegistry[name];
+  ProtobufContainer? getFieldType(String name) => _typeRegistry[name];
 }
diff --git a/protoc_plugin/lib/src/message_generator.dart b/protoc_plugin/lib/src/message_generator.dart
index 92c3beb..9b8c560 100644
--- a/protoc_plugin/lib/src/message_generator.dart
+++ b/protoc_plugin/lib/src/message_generator.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 part of '../protoc.dart';
 
 /// Generates the Dart enum corresponding to a oneof declaration.
@@ -15,7 +13,7 @@
       IndentingWriter out, String classname, List<ProtobufField> fields) {
     out.addBlock('enum $classname {', '}\n', () {
       for (var field in fields) {
-        final name = oneofEnumMemberName(field.memberNames.fieldName);
+        final name = oneofEnumMemberName(field.memberNames!.fieldName);
         out.println('$name, ');
       }
       out.println('notSet');
@@ -51,10 +49,11 @@
   String get messageName =>
       fullName.substring(package.isEmpty ? 0 : package.length + 1);
 
-  PbMixin mixin;
+  PbMixin? mixin;
 
   @override
-  final ProtobufContainer parent;
+  final ProtobufContainer? parent;
+
   final DescriptorProto _descriptor;
   final List<EnumGenerator> _enumGenerators = <EnumGenerator>[];
   final List<MessageGenerator> _messageGenerators = <MessageGenerator>[];
@@ -64,18 +63,18 @@
   /// by the index in the containing types's oneof_decl list.
   /// Only contains the 'real' oneofs.
   final List<List<ProtobufField>> _oneofFields;
-  List<OneofNames> _oneofNames;
+  late List<OneofNames> _oneofNames;
 
-  List<int> _fieldPath;
   final List<int> _fieldPathSegment;
 
   /// See [[ProtobufContainer]
   @override
-  List<int> get fieldPath =>
-      _fieldPath ??= List.from(parent.fieldPath)..addAll(_fieldPathSegment);
+  late final List<int> fieldPath = List.from(parent!.fieldPath!)
+    ..addAll(_fieldPathSegment);
 
   // populated by resolve()
-  List<ProtobufField> _fieldList;
+  late List<ProtobufField> _fieldList;
+  bool _resolved = false;
 
   Set<String> _usedTopLevelNames;
 
@@ -83,7 +82,7 @@
       DescriptorProto descriptor,
       this.parent,
       Map<String, PbMixin> declaredMixins,
-      PbMixin defaultMixin,
+      PbMixin? defaultMixin,
       this._usedTopLevelNames,
       int repeatedFieldIndex,
       int fieldIdTag)
@@ -92,7 +91,7 @@
         classname = messageOrEnumClassName(descriptor.name, _usedTopLevelNames,
             parent: parent?.classname ?? ''),
         assert(parent != null),
-        fullName = parent.fullName == ''
+        fullName = parent!.fullName == ''
             ? descriptor.name
             : '${parent.fullName}.${descriptor.name}',
         _oneofFields =
@@ -127,7 +126,7 @@
       DescriptorProto descriptor,
       ProtobufContainer parent,
       Map<String, PbMixin> declaredMixins,
-      PbMixin defaultMixin,
+      PbMixin? defaultMixin,
       Set<String> usedNames,
       int repeatedFieldIndex)
       : this._(descriptor, parent, declaredMixins, defaultMixin, usedNames,
@@ -137,22 +136,22 @@
       DescriptorProto descriptor,
       ProtobufContainer parent,
       Map<String, PbMixin> declaredMixins,
-      PbMixin defaultMixin,
+      PbMixin? defaultMixin,
       Set<String> usedNames,
       int repeatedFieldIndex)
       : this._(descriptor, parent, declaredMixins, defaultMixin, usedNames,
             repeatedFieldIndex, _nestedMessageTag);
 
   @override
-  String get package => parent.package;
+  String get package => parent!.package;
 
   /// The generator of the .pb.dart file that will declare this type.
   @override
-  FileGenerator get fileGen => parent.fileGen;
+  FileGenerator get fileGen => parent!.fileGen!;
 
   /// Throws an exception if [resolve] hasn't been called yet.
   void checkResolved() {
-    if (_fieldList == null) {
+    if (!_resolved) {
       throw StateError('message not resolved: $fullName');
     }
   }
@@ -170,7 +169,7 @@
   /// Adds all mixins used in this message and any submessages.
   void addMixinsTo(Set<PbMixin> output) {
     if (mixin != null) {
-      output.addAll(mixin.findMixinsToApply());
+      output.addAll(mixin!.findMixinsToApply());
     }
     for (var m in _messageGenerators) {
       m.addMixinsTo(output);
@@ -190,7 +189,8 @@
 
   // Creates fields and resolves extension targets.
   void resolve(GenerationContext ctx) {
-    if (_fieldList != null) throw StateError('message already resolved');
+    if (_resolved) throw StateError('message already resolved');
+    _resolved = true;
 
     var reserved = mixin?.findReservedNames() ?? const <String>[];
     var members = messageMemberNames(_descriptor, classname, _usedTopLevelNames,
@@ -216,7 +216,7 @@
   }
 
   bool get needsFixnumImport {
-    if (_fieldList == null) throw StateError('message not resolved');
+    checkResolved();
     for (var field in _fieldList) {
       if (field.needsFixnumImport) return true;
     }
@@ -235,13 +235,13 @@
   /// add its generator.
   void addImportsTo(
       Set<FileGenerator> imports, Set<FileGenerator> enumImports) {
-    if (_fieldList == null) throw StateError('message not resolved');
+    checkResolved();
     for (var field in _fieldList) {
       var typeGen = field.baseType.generator;
       if (typeGen is EnumGenerator) {
-        enumImports.add(typeGen.fileGen);
+        enumImports.add(typeGen.fileGen!);
       } else if (typeGen != null) {
-        imports.add(typeGen.fileGen);
+        imports.add(typeGen.fileGen!);
       }
     }
     for (var m in _messageGenerators) {
@@ -266,7 +266,7 @@
   /// For each .pbjson.dart file that the generated code needs to import,
   /// add its generator.
   void addConstantImportsTo(Set<FileGenerator> imports) {
-    if (_fieldList == null) throw StateError('message not resolved');
+    checkResolved();
     for (var m in _messageGenerators) {
       m.addConstantImportsTo(imports);
     }
@@ -293,7 +293,7 @@
     var mixinClause = '';
     if (mixin != null) {
       var mixinNames =
-          mixin.findMixinsToApply().map((m) => '$mixinImportPrefix.${m.name}');
+          mixin!.findMixinsToApply().map((m) => '$mixinImportPrefix.${m.name}');
       mixinClause = ' with ${mixinNames.join(", ")}';
     }
 
@@ -304,8 +304,8 @@
     var packageClause =
         package == '' ? '' : ', package: $conditionalPackageName';
     var proto3JsonClause = (mixin?.hasProto3JsonHelpers ?? false)
-        ? ', toProto3Json: $mixinImportPrefix.${mixin.name}.toProto3JsonHelper, '
-            'fromProto3Json: $mixinImportPrefix.${mixin.name}.fromProto3JsonHelper'
+        ? ', toProto3Json: $mixinImportPrefix.${mixin!.name}.toProto3JsonHelper, '
+            'fromProto3Json: $mixinImportPrefix.${mixin!.name}.fromProto3JsonHelper'
         : '';
     out.addAnnotatedBlock(
         'class $classname extends $protobufImportPrefix.GeneratedMessage$mixinClause {',
@@ -319,7 +319,7 @@
             '};', () {
           for (var field in _oneofFields[oneof.index]) {
             final oneofMemberName =
-                oneofEnumMemberName(field.memberNames.fieldName);
+                oneofEnumMemberName(field.memberNames!.fieldName);
             out.println(
                 '${field.number} : ${oneof.oneofEnumName}.$oneofMemberName,');
           }
@@ -369,10 +369,10 @@
           _emitDeprecatedIf(field.isDeprecated, out);
           if (field.isRepeated && !field.isMapField) {
             out.println(
-                '  ${field.baseType.getRepeatedDartTypeIterable(fileGen)}? ${field.memberNames.fieldName},');
+                '  ${field.baseType.getRepeatedDartTypeIterable(fileGen)}? ${field.memberNames!.fieldName},');
           } else {
             out.println(
-                '  ${field.getDartType(fileGen)}? ${field.memberNames.fieldName},');
+                '  ${field.getDartType(fileGen)}? ${field.memberNames!.fieldName},');
           }
         }
         out.print('}');
@@ -381,17 +381,17 @@
         out.println(') {');
         out.println('  final _result = create();');
         for (final field in _fieldList) {
-          out.println('  if (${field.memberNames.fieldName} != null) {');
+          out.println('  if (${field.memberNames!.fieldName} != null) {');
           if (field.isDeprecated) {
             out.println(
                 '    // ignore: deprecated_member_use_from_same_package');
           }
           if (field.isRepeated || field.isMapField) {
             out.println(
-                '    _result.${field.memberNames.fieldName}.addAll(${field.memberNames.fieldName});');
+                '    _result.${field.memberNames!.fieldName}.addAll(${field.memberNames!.fieldName});');
           } else {
             out.println(
-                '    _result.${field.memberNames.fieldName} = ${field.memberNames.fieldName};');
+                '    _result.${field.memberNames!.fieldName} = ${field.memberNames!.fieldName};');
           }
           out.println('  }');
         }
@@ -452,7 +452,7 @@
   // already_seen is used to avoid checking the same type multiple times
   // (and also to protect against unbounded recursion).
   bool _hasRequiredFields(MessageGenerator type, Set alreadySeen) {
-    if (type._fieldList == null) throw StateError('message not resolved');
+    checkResolved();
 
     if (alreadySeen.contains(type.fullName)) {
       // The type is already in cache.  This means that either:
@@ -495,7 +495,7 @@
     for (var field in _fieldList) {
       out.println();
       var memberFieldPath = List<int>.from(fieldPath)
-        ..addAll([_messageFieldTag, field.sourcePosition]);
+        ..addAll([_messageFieldTag, field.sourcePosition!]);
       generateFieldAccessorsMutators(field, out, memberFieldPath);
     }
   }
@@ -517,10 +517,10 @@
     _emitDeprecatedIf(field.isDeprecated, out);
     _emitOverrideIf(field.overridesGetter, out);
     _emitIndexAnnotation(field.number, out);
-    final getterExpr = _getterExpression(fieldTypeString, field.index,
+    final getterExpr = _getterExpression(fieldTypeString, field.index!,
         defaultExpr, field.isRepeated, field.isMapField);
     out.printlnAnnotated(
-        '$fieldTypeString get ${names.fieldName} => $getterExpr;', [
+        '$fieldTypeString get ${names!.fieldName} => $getterExpr;', [
       NamedLocation(
           name: names.fieldName,
           fieldPathSegment: memberFieldPath,
@@ -579,7 +579,7 @@
             ' \$_has(${field.index});',
             [
               NamedLocation(
-                  name: names.hasMethodName,
+                  name: names.hasMethodName!,
                   fieldPathSegment: memberFieldPath,
                   start: '$coreImportPrefix.bool '.length)
             ]);
@@ -592,7 +592,7 @@
           ' clearField(${field.number});',
           [
             NamedLocation(
-                name: names.clearMethodName,
+                name: names.clearMethodName!,
                 fieldPathSegment: memberFieldPath,
                 start: 'void '.length)
           ]);
@@ -604,7 +604,7 @@
             '\$_ensure(${field.index});',
             <NamedLocation>[
               NamedLocation(
-                  name: names.ensureMethodName,
+                  name: names.ensureMethodName!,
                   fieldPathSegment: memberFieldPath,
                   start: '$fieldTypeString '.length)
             ]);
@@ -677,8 +677,8 @@
   void generateConstants(IndentingWriter out) {
     const nestedTypeTag = 3;
     const enumTypeTag = 4;
-    assert(_descriptor.info_.fieldInfo[nestedTypeTag].name == 'nestedType');
-    assert(_descriptor.info_.fieldInfo[enumTypeTag].name == 'enumType');
+    assert(_descriptor.info_.fieldInfo[nestedTypeTag]!.name == 'nestedType');
+    assert(_descriptor.info_.fieldInfo[enumTypeTag]!.name == 'enumType');
 
     var name = getJsonConstant(fileGen);
     var json = _descriptor.writeToJsonMap();
@@ -688,7 +688,7 @@
         _enumGenerators.map((e) => e.getJsonConstant(fileGen)).toList();
 
     out.println('@$coreImportPrefix.Deprecated'
-        '(\'Use ${toplevelParent.binaryDescriptorName} instead\')');
+        '(\'Use ${toplevelParent!.binaryDescriptorName} instead\')');
     out.addBlock('const $name = const {', '};', () {
       for (var key in json.keys) {
         out.print("'$key': ");
@@ -720,7 +720,8 @@
   ///
   /// First searches [_wellKnownMixins], then [declaredMixins],
   /// then internal mixins declared by [findMixin].
-  PbMixin _getMixin(Map<String, PbMixin> declaredMixins, PbMixin defaultMixin) {
+  PbMixin? _getMixin(
+      Map<String, PbMixin> declaredMixins, PbMixin? defaultMixin) {
     var wellKnownMixin = wellKnownMixinForFullName(fullName);
     if (wellKnownMixin != null) return wellKnownMixin;
     if (!_descriptor.hasOptions() ||
@@ -732,7 +733,7 @@
     if (name.isEmpty) return null; // don't use any mixins (override default)
     var mixin = declaredMixins[name] ?? findMixin(name);
     if (mixin == null) {
-      throw '${_descriptor.name} in ${parent.fileGen.descriptor.name}: mixin "$name" not found';
+      throw '${_descriptor.name} in ${parent!.fileGen!.descriptor.name}: mixin "$name" not found';
     }
     return mixin;
   }
diff --git a/protoc_plugin/lib/src/protobuf_field.dart b/protoc_plugin/lib/src/protobuf_field.dart
index 7f8dad6..5fa3b1c 100644
--- a/protoc_plugin/lib/src/protobuf_field.dart
+++ b/protoc_plugin/lib/src/protobuf_field.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 part of '../protoc.dart';
 
 class ProtobufField {
@@ -22,7 +20,7 @@
   final FieldDescriptorProto descriptor;
 
   /// Dart names within a GeneratedMessage or `null` for an extension.
-  final FieldNames memberNames;
+  final FieldNames? memberNames;
 
   final String fullName;
   final BaseType baseType;
@@ -35,7 +33,7 @@
       ProtobufContainer parent, GenerationContext ctx)
       : this._(descriptor, null, parent, ctx);
 
-  ProtobufField._(this.descriptor, FieldNames dartNames,
+  ProtobufField._(this.descriptor, FieldNames? dartNames,
       ProtobufContainer parent, GenerationContext ctx)
       : memberNames = dartNames,
         fullName = '${parent.fullName}.${descriptor.name}',
@@ -44,18 +42,18 @@
   /// The index of this field in MessageGenerator.fieldList.
   ///
   /// `null` for an extension.
-  int get index => memberNames?.index;
+  int? get index => memberNames?.index;
 
-  String get quotedProtoName =>
+  String? get quotedProtoName =>
       (_unCamelCase(descriptor.jsonName) == descriptor.name)
           ? null
           : "'${descriptor.name}'";
 
   /// The position of this field as it appeared in the original DescriptorProto.
-  int get sourcePosition => memberNames.sourcePosition;
+  int? get sourcePosition => memberNames?.sourcePosition;
 
   /// True if the field is to be encoded with [deprecated = true] encoding.
-  bool get isDeprecated => descriptor.options?.deprecated;
+  bool get isDeprecated => descriptor.options.deprecated;
 
   bool get isRequired =>
       descriptor.label == FieldDescriptorProto_Label.LABEL_REQUIRED;
@@ -64,8 +62,7 @@
       descriptor.label == FieldDescriptorProto_Label.LABEL_REPEATED;
 
   /// True if the field is to be encoded with [packed=true] encoding.
-  bool get isPacked =>
-      isRepeated && descriptor.options != null && descriptor.options.packed;
+  bool get isPacked => isRepeated && descriptor.options.packed;
 
   /// Whether the field has the `overrideGetter` annotation set to true.
   bool get overridesGetter => _hasBooleanOption(Dart_options.overrideGetter);
@@ -145,7 +142,7 @@
   }
 
   static String _formatArguments(
-      List<String> positionals, Map<String, String> named) {
+      List<String?> positionals, Map<String, String?> named) {
     final args = positionals.toList();
     while (args.last == null) {
       args.removeLast();
@@ -178,7 +175,7 @@
     String invocation;
 
     var args = <String>[];
-    var named = <String, String>{'protoName': quotedProtoName};
+    var named = <String, String?>{'protoName': quotedProtoName};
     args.add('$number');
     args.add(quotedName);
 
@@ -279,7 +276,6 @@
         }
       }
     }
-    assert(invocation != null);
     return '..$invocation(${_formatArguments(args, named)})';
   }
 
@@ -291,15 +287,15 @@
     if (isRepeated) return 'null';
     switch (descriptor.type) {
       case FieldDescriptorProto_Type.TYPE_BOOL:
-        return _getDefaultAsBoolExpr('false');
+        return _getDefaultAsBoolExpr('false')!;
       case FieldDescriptorProto_Type.TYPE_INT32:
       case FieldDescriptorProto_Type.TYPE_UINT32:
       case FieldDescriptorProto_Type.TYPE_SINT32:
       case FieldDescriptorProto_Type.TYPE_FIXED32:
       case FieldDescriptorProto_Type.TYPE_SFIXED32:
-        return _getDefaultAsInt32Expr('0');
+        return _getDefaultAsInt32Expr('0')!;
       case FieldDescriptorProto_Type.TYPE_STRING:
-        return _getDefaultAsStringExpr("''");
+        return _getDefaultAsStringExpr("''")!;
       default:
         return 'null';
     }
@@ -309,7 +305,7 @@
   ///
   /// [fileGen] represents the .proto file where the expression will be
   /// evaluated.
-  String generateDefaultFunction(FileGenerator fileGen) {
+  String? generateDefaultFunction(FileGenerator? fileGen) {
     assert(!isRepeated);
     switch (descriptor.type) {
       case FieldDescriptorProto_Type.TYPE_BOOL:
@@ -363,9 +359,9 @@
         return '() => <$coreImportPrefix.int>[$byteList]';
       case FieldDescriptorProto_Type.TYPE_GROUP:
       case FieldDescriptorProto_Type.TYPE_MESSAGE:
-        return '${baseType.getDartType(fileGen)}.getDefault';
+        return '${baseType.getDartType(fileGen!)}.getDefault';
       case FieldDescriptorProto_Type.TYPE_ENUM:
-        var className = baseType.getDartType(fileGen);
+        var className = baseType.getDartType(fileGen!);
         final gen = baseType.generator as EnumGenerator;
         if (descriptor.hasDefaultValue() &&
             descriptor.defaultValue.isNotEmpty) {
@@ -379,14 +375,14 @@
     }
   }
 
-  String _getDefaultAsBoolExpr(String noDefault) {
+  String? _getDefaultAsBoolExpr(String? noDefault) {
     if (descriptor.hasDefaultValue() && 'false' != descriptor.defaultValue) {
       return descriptor.defaultValue;
     }
     return noDefault;
   }
 
-  String _getDefaultAsStringExpr(String noDefault) {
+  String? _getDefaultAsStringExpr(String? noDefault) {
     if (!descriptor.hasDefaultValue() || descriptor.defaultValue.isEmpty) {
       return noDefault;
     }
@@ -394,7 +390,7 @@
     return quoted(descriptor.defaultValue);
   }
 
-  String _getDefaultAsInt32Expr(String noDefault) {
+  String? _getDefaultAsInt32Expr(String? noDefault) {
     if (descriptor.hasDefaultValue() && '0' != descriptor.defaultValue) {
       return descriptor.defaultValue;
     }
@@ -402,7 +398,7 @@
   }
 
   bool _hasBooleanOption(Extension extension) =>
-      descriptor?.options?.getExtension(extension) as bool ?? false;
+      descriptor.options.getExtension(extension) as bool? ?? false;
 
   String get _invalidDefaultValue => 'dart-protoc-plugin:'
       ' invalid default value (${descriptor.defaultValue})'
@@ -416,6 +412,6 @@
 
   static String _unCamelCase(String name) {
     return name.replaceAllMapped(
-        _upperCase, (match) => '_${match.group(0).toLowerCase()}');
+        _upperCase, (match) => '_${match.group(0)!.toLowerCase()}');
   }
 }
diff --git a/protoc_plugin/lib/src/service_generator.dart b/protoc_plugin/lib/src/service_generator.dart
index 3fcd1a9..53ef39c 100644
--- a/protoc_plugin/lib/src/service_generator.dart
+++ b/protoc_plugin/lib/src/service_generator.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 part of '../protoc.dart';
 
 class ServiceGenerator {
@@ -68,7 +66,7 @@
   void _addDependency(GenerationContext ctx, String fqname, String location) {
     if (_deps.containsKey(fqname)) return; // Already added.
 
-    final mg = ctx.getFieldType(fqname) as MessageGenerator;
+    final mg = ctx.getFieldType(fqname) as MessageGenerator?;
     if (mg == null) {
       _undefinedDeps[fqname] = location;
       return;
@@ -226,7 +224,7 @@
 
     var typeConstants = <String, String>{};
     for (var key in _transitiveDeps.keys) {
-      typeConstants[key] = _transitiveDeps[key].getJsonConstant(fileGen);
+      typeConstants[key] = _transitiveDeps[key]!.getJsonConstant(fileGen);
     }
 
     out.println('@$coreImportPrefix.Deprecated'
diff --git a/protoc_plugin/lib/src/well_known_types.dart b/protoc_plugin/lib/src/well_known_types.dart
index 7fabd87..24e360b 100644
--- a/protoc_plugin/lib/src/well_known_types.dart
+++ b/protoc_plugin/lib/src/well_known_types.dart
@@ -2,11 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 part of '../protoc.dart';
 
-PbMixin wellKnownMixinForFullName(String qualifiedName) =>
+PbMixin? wellKnownMixinForFullName(String qualifiedName) =>
     _wellKnownMixins[qualifiedName];
 
 const _wellKnownImportPath =
diff --git a/protoc_plugin/test/any_test.dart b/protoc_plugin/test/any_test.dart
index a29d6d1..df1cb12 100644
--- a/protoc_plugin/test/any_test.dart
+++ b/protoc_plugin/test/any_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 import 'package:protobuf/protobuf.dart';
 import 'package:test/test.dart';
 
diff --git a/protoc_plugin/test/bazel_test.dart b/protoc_plugin/test/bazel_test.dart
index e1ef89c..0cca05b 100644
--- a/protoc_plugin/test/bazel_test.dart
+++ b/protoc_plugin/test/bazel_test.dart
@@ -2,17 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 import 'package:protoc_plugin/bazel.dart';
 import 'package:test/test.dart';
 
 void main() {
   group('BazelOptionParser', () {
-    BazelOptionParser optionParser;
-    Map<String, BazelPackage> packages;
-    List<String> errors;
-
+    late BazelOptionParser optionParser;
+    late Map<String, BazelPackage> packages;
+    late List<String> errors;
+    final optionName = 'name';
     setUp(() {
       packages = {};
       optionParser = BazelOptionParser(packages);
@@ -24,95 +22,95 @@
     }
 
     test('should call onError for null values', () {
-      optionParser.parse(null, null, _onError);
+      optionParser.parse(optionName, null, _onError);
       expect(errors, isNotEmpty);
     });
 
     test('should call onError for empty values', () {
-      optionParser.parse(null, '', _onError);
+      optionParser.parse(optionName, '', _onError);
       expect(errors, isNotEmpty);
     });
 
     test('should call onError for malformed entries', () {
-      optionParser.parse(null, 'foo', _onError);
-      optionParser.parse(null, 'foo|bar', _onError);
-      optionParser.parse(null, 'foo|bar|baz|quux', _onError);
+      optionParser.parse(optionName, 'foo', _onError);
+      optionParser.parse(optionName, 'foo|bar', _onError);
+      optionParser.parse(optionName, 'foo|bar|baz|quux', _onError);
       expect(errors.length, 3);
       expect(packages, isEmpty);
     });
 
     test('should handle a single package|path entry', () {
-      optionParser.parse(null, 'foo|bar/baz|wibble/wobble', _onError);
+      optionParser.parse(optionName, 'foo|bar/baz|wibble/wobble', _onError);
       expect(errors, isEmpty);
       expect(packages.length, 1);
-      expect(packages['bar/baz'].name, 'foo');
-      expect(packages['bar/baz'].inputRoot, 'bar/baz');
-      expect(packages['bar/baz'].outputRoot, 'wibble/wobble');
+      expect(packages['bar/baz']!.name, 'foo');
+      expect(packages['bar/baz']!.inputRoot, 'bar/baz');
+      expect(packages['bar/baz']!.outputRoot, 'wibble/wobble');
     });
 
     test('should handle multiple package|path entries', () {
       optionParser.parse(
-          null,
+          optionName,
           'foo|bar/baz|wibble/wobble;a|b/c/d|e/f;one.two|three|four/five',
           _onError);
       expect(errors, isEmpty);
       expect(packages.length, 3);
-      expect(packages['bar/baz'].name, 'foo');
-      expect(packages['bar/baz'].inputRoot, 'bar/baz');
-      expect(packages['bar/baz'].outputRoot, 'wibble/wobble');
-      expect(packages['b/c/d'].name, 'a');
-      expect(packages['b/c/d'].inputRoot, 'b/c/d');
-      expect(packages['b/c/d'].outputRoot, 'e/f');
-      expect(packages['three'].name, 'one.two');
-      expect(packages['three'].inputRoot, 'three');
-      expect(packages['three'].outputRoot, 'four/five');
+      expect(packages['bar/baz']!.name, 'foo');
+      expect(packages['bar/baz']!.inputRoot, 'bar/baz');
+      expect(packages['bar/baz']!.outputRoot, 'wibble/wobble');
+      expect(packages['b/c/d']!.name, 'a');
+      expect(packages['b/c/d']!.inputRoot, 'b/c/d');
+      expect(packages['b/c/d']!.outputRoot, 'e/f');
+      expect(packages['three']!.name, 'one.two');
+      expect(packages['three']!.inputRoot, 'three');
+      expect(packages['three']!.outputRoot, 'four/five');
     });
 
     test('should skip and continue past malformed entries', () {
-      optionParser.parse(null,
+      optionParser.parse(optionName,
           'foo|bar/baz|wibble/wobble;fizz;a.b|c/d|e/f;x|y|zz|y', _onError);
       expect(errors.length, 2);
       expect(packages.length, 2);
-      expect(packages['bar/baz'].name, 'foo');
-      expect(packages['c/d'].name, 'a.b');
+      expect(packages['bar/baz']!.name, 'foo');
+      expect(packages['c/d']!.name, 'a.b');
     });
 
     test('should emit error for conflicting package names', () {
-      optionParser.parse(null,
+      optionParser.parse(optionName,
           'foo|bar/baz|wibble/wobble;flob|bar/baz|wibble/wobble', _onError);
       expect(errors.length, 1);
       expect(packages.length, 1);
-      expect(packages['bar/baz'].name, 'foo');
+      expect(packages['bar/baz']!.name, 'foo');
     });
 
-    test('should emit error for conflicting output_roots', () {
-      optionParser.parse(null,
+    test('should emit error for conflicting outputRoots', () {
+      optionParser.parse(optionName,
           'foo|bar/baz|wibble/wobble;foo|bar/baz|womble/wumble', _onError);
       expect(errors.length, 1);
       expect(packages.length, 1);
-      expect(packages['bar/baz'].outputRoot, 'wibble/wobble');
+      expect(packages['bar/baz']!.outputRoot, 'wibble/wobble');
     });
 
     test('should normalize paths', () {
-      optionParser.parse(
-          null, 'foo|bar//baz/|quux/;a|b/|c;c|d//e/f///|g//h//', _onError);
+      optionParser.parse(optionName,
+          'foo|bar//baz/|quux/;a|b/|c;c|d//e/f///|g//h//', _onError);
       expect(errors, isEmpty);
       expect(packages.length, 3);
-      expect(packages['bar/baz'].name, 'foo');
-      expect(packages['bar/baz'].inputRoot, 'bar/baz');
-      expect(packages['bar/baz'].outputRoot, 'quux');
-      expect(packages['b'].name, 'a');
-      expect(packages['b'].inputRoot, 'b');
-      expect(packages['b'].outputRoot, 'c');
-      expect(packages['d/e/f'].name, 'c');
-      expect(packages['d/e/f'].inputRoot, 'd/e/f');
-      expect(packages['d/e/f'].outputRoot, 'g/h');
+      expect(packages['bar/baz']!.name, 'foo');
+      expect(packages['bar/baz']!.inputRoot, 'bar/baz');
+      expect(packages['bar/baz']!.outputRoot, 'quux');
+      expect(packages['b']!.name, 'a');
+      expect(packages['b']!.inputRoot, 'b');
+      expect(packages['b']!.outputRoot, 'c');
+      expect(packages['d/e/f']!.name, 'c');
+      expect(packages['d/e/f']!.inputRoot, 'd/e/f');
+      expect(packages['d/e/f']!.outputRoot, 'g/h');
     });
   });
 
   group('BazelOutputConfiguration', () {
     Map<String, BazelPackage> packages;
-    BazelOutputConfiguration config;
+    late BazelOutputConfiguration config;
 
     setUp(() {
       packages = {
diff --git a/protoc_plugin/test/client_generator_test.dart b/protoc_plugin/test/client_generator_test.dart
index 157805c..fbe2398 100644
--- a/protoc_plugin/test/client_generator_test.dart
+++ b/protoc_plugin/test/client_generator_test.dart
@@ -3,8 +3,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 import 'package:protoc_plugin/indenting_writer.dart';
 import 'package:protoc_plugin/protoc.dart';
 import 'package:protoc_plugin/src/linker.dart';
diff --git a/protoc_plugin/test/default_value_escape_test.dart b/protoc_plugin/test/default_value_escape_test.dart
index 2894c50..b71a01b 100644
--- a/protoc_plugin/test/default_value_escape_test.dart
+++ b/protoc_plugin/test/default_value_escape_test.dart
@@ -3,8 +3,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 import 'package:test/test.dart';
 
 import '../out/protos/default_value_escape.pb.dart';
diff --git a/protoc_plugin/test/descriptor_test.dart b/protoc_plugin/test/descriptor_test.dart
index cc97675..34085cf 100644
--- a/protoc_plugin/test/descriptor_test.dart
+++ b/protoc_plugin/test/descriptor_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 import 'package:protobuf/protobuf.dart';
 import 'package:protoc_plugin/src/generated/descriptor.pb.dart';
 import 'package:test/test.dart';
diff --git a/protoc_plugin/test/enum_generator_test.dart b/protoc_plugin/test/enum_generator_test.dart
index a2b7b02..715df7e 100755
--- a/protoc_plugin/test/enum_generator_test.dart
+++ b/protoc_plugin/test/enum_generator_test.dart
@@ -3,8 +3,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 import 'package:protoc_plugin/indenting_writer.dart';
 import 'package:protoc_plugin/protoc.dart';
 import 'package:protoc_plugin/src/generated/descriptor.pb.dart';
diff --git a/protoc_plugin/test/extension_generator_test.dart b/protoc_plugin/test/extension_generator_test.dart
index b49ff6d..ceb0696 100644
--- a/protoc_plugin/test/extension_generator_test.dart
+++ b/protoc_plugin/test/extension_generator_test.dart
@@ -3,8 +3,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 import 'package:protoc_plugin/indenting_writer.dart';
 import 'package:protoc_plugin/protoc.dart';
 import 'package:protoc_plugin/src/generated/descriptor.pb.dart' as pb;
diff --git a/protoc_plugin/test/extension_test.dart b/protoc_plugin/test/extension_test.dart
index 56b7408..c4b668a 100644
--- a/protoc_plugin/test/extension_test.dart
+++ b/protoc_plugin/test/extension_test.dart
@@ -3,8 +3,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 import 'package:protobuf/protobuf.dart';
 import 'package:test/test.dart';
 
@@ -17,7 +15,8 @@
 import '../out/protos/non_nested_extension.pb.dart';
 import 'test_util.dart';
 
-Matcher throwsArgError(String expectedMessage) => throwsA(predicate((x) {
+Matcher throwsArgError(String expectedMessage) =>
+    throwsA(predicate((dynamic x) {
       expect(x, isArgumentError);
       expect(x.message, expectedMessage);
       return true;
@@ -174,14 +173,14 @@
   });
 
   test('can extend a message with a message field with a different type', () {
-    expect(Non_nested_extension.nonNestedExtension.makeDefault(),
+    expect(Non_nested_extension.nonNestedExtension.makeDefault!(),
         TypeMatcher<MyNonNestedExtension>());
     expect(Non_nested_extension.nonNestedExtension.name, 'nonNestedExtension');
   });
 
   test('can extend a message with a message field of the same type', () {
     expect(
-        MyNestedExtension.recursiveExtension.makeDefault()
+        MyNestedExtension.recursiveExtension.makeDefault!()
             is MessageToBeExtended,
         isTrue);
     expect(MyNestedExtension.recursiveExtension.name, 'recursiveExtension');
@@ -532,7 +531,7 @@
     final withUnknownFields = Outer.fromBuffer(original.writeToBuffer());
 
     expect(
-        withUnknownFields.innerMap[0]
+        withUnknownFields.innerMap[0]!
             .hasExtension(Extend_unittest.innerExtensionString),
         isFalse);
 
@@ -540,7 +539,8 @@
     final reparsed = r.reparseMessage(withUnknownFields);
 
     expect(
-        reparsed.innerMap[0].hasExtension(Extend_unittest.innerExtensionString),
+        reparsed.innerMap[0]!
+            .hasExtension(Extend_unittest.innerExtensionString),
         isTrue);
     expect(
         identical(withUnknownFields.innerMap[1], reparsed.innerMap[1]), isTrue);
diff --git a/protoc_plugin/test/file_generator_test.dart b/protoc_plugin/test/file_generator_test.dart
index 84c733a..6763579 100644
--- a/protoc_plugin/test/file_generator_test.dart
+++ b/protoc_plugin/test/file_generator_test.dart
@@ -3,8 +3,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 import 'package:protoc_plugin/indenting_writer.dart';
 import 'package:protoc_plugin/protoc.dart';
 import 'package:protoc_plugin/src/generated/descriptor.pb.dart';
@@ -95,8 +93,8 @@
   test('FileGenerator outputs a .pb.dart file for a proto with one message',
       () {
     var fd = buildFileDescriptor();
-    var options =
-        parseGenerationOptions(CodeGeneratorRequest(), CodeGeneratorResponse());
+    var options = parseGenerationOptions(
+        CodeGeneratorRequest(), CodeGeneratorResponse())!;
     var fg = FileGenerator(fd, options);
     link(options, [fg]);
     expectMatchesGoldenFile(
@@ -105,8 +103,8 @@
 
   test('FileGenerator outputs a .pb.dart file for an Int64 message', () {
     var fd = createInt64Proto();
-    var options =
-        parseGenerationOptions(CodeGeneratorRequest(), CodeGeneratorResponse());
+    var options = parseGenerationOptions(
+        CodeGeneratorRequest(), CodeGeneratorResponse())!;
     var fg = FileGenerator(fd, options);
     link(options, [fg]);
     expectMatchesGoldenFile(
@@ -119,7 +117,7 @@
     var fd = buildFileDescriptor();
     var options = parseGenerationOptions(
         CodeGeneratorRequest()..parameter = 'generate_kythe_info',
-        CodeGeneratorResponse());
+        CodeGeneratorResponse())!;
     var fg = FileGenerator(fd, options);
     link(options, [fg]);
     expectMatchesGoldenFile(fg.generateMainFile().sourceLocationInfo.toString(),
@@ -129,8 +127,8 @@
   test('FileGenerator outputs a pbjson.dart file for a proto with one message',
       () {
     var fd = buildFileDescriptor();
-    var options =
-        parseGenerationOptions(CodeGeneratorRequest(), CodeGeneratorResponse());
+    var options = parseGenerationOptions(
+        CodeGeneratorRequest(), CodeGeneratorResponse())!;
     var fg = FileGenerator(fd, options);
     link(options, [fg]);
     expectMatchesGoldenFile(
@@ -139,8 +137,8 @@
 
   test('FileGenerator generates files for a top-level enum', () {
     var fd = buildFileDescriptor(phoneNumber: false, topLevelEnum: true);
-    var options =
-        parseGenerationOptions(CodeGeneratorRequest(), CodeGeneratorResponse());
+    var options = parseGenerationOptions(
+        CodeGeneratorRequest(), CodeGeneratorResponse())!;
 
     var fg = FileGenerator(fd, options);
     link(options, [fg]);
@@ -154,7 +152,7 @@
     var fd = buildFileDescriptor(phoneNumber: false, topLevelEnum: true);
     var options = parseGenerationOptions(
         CodeGeneratorRequest()..parameter = 'generate_kythe_info',
-        CodeGeneratorResponse());
+        CodeGeneratorResponse())!;
     var fg = FileGenerator(fd, options);
     link(options, [fg]);
 
@@ -166,8 +164,8 @@
 
   test('FileGenerator generates a .pbjson.dart file for a top-level enum', () {
     var fd = buildFileDescriptor(phoneNumber: false, topLevelEnum: true);
-    var options =
-        parseGenerationOptions(CodeGeneratorRequest(), CodeGeneratorResponse());
+    var options = parseGenerationOptions(
+        CodeGeneratorRequest(), CodeGeneratorResponse())!;
 
     var fg = FileGenerator(fd, options);
     link(options, [fg]);
@@ -178,8 +176,8 @@
   test('FileGenerator outputs library for a .proto in a package', () {
     var fd = buildFileDescriptor();
     fd.package = 'pb_library';
-    var options =
-        parseGenerationOptions(CodeGeneratorRequest(), CodeGeneratorResponse());
+    var options = parseGenerationOptions(
+        CodeGeneratorRequest(), CodeGeneratorResponse())!;
 
     var fg = FileGenerator(fd, options);
     link(options, [fg]);
@@ -203,8 +201,8 @@
             ..type = FieldDescriptorProto_Type.TYPE_INT64
         ]));
 
-    var options =
-        parseGenerationOptions(CodeGeneratorRequest(), CodeGeneratorResponse());
+    var options = parseGenerationOptions(
+        CodeGeneratorRequest(), CodeGeneratorResponse())!;
 
     var fg = FileGenerator(fd, options);
     link(options, [fg]);
@@ -230,8 +228,8 @@
       ..messageType.add(empty)
       ..service.add(sd);
 
-    var options =
-        parseGenerationOptions(CodeGeneratorRequest(), CodeGeneratorResponse());
+    var options = parseGenerationOptions(
+        CodeGeneratorRequest(), CodeGeneratorResponse())!;
 
     var fg = FileGenerator(fd, options);
     link(options, [fg]);
@@ -420,7 +418,7 @@
     fd.dependency.addAll(['package1.proto', 'package2.proto']);
     var request = CodeGeneratorRequest();
     var response = CodeGeneratorResponse();
-    var options = parseGenerationOptions(request, response);
+    var options = parseGenerationOptions(request, response)!;
 
     var fg = FileGenerator(fd, options);
     link(options,
diff --git a/protoc_plugin/test/message_generator_test.dart b/protoc_plugin/test/message_generator_test.dart
index 1cf2c4a..e8b6d2e 100755
--- a/protoc_plugin/test/message_generator_test.dart
+++ b/protoc_plugin/test/message_generator_test.dart
@@ -3,8 +3,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 import 'dart:collection';
 
 import 'package:collection/collection.dart';
@@ -19,9 +17,9 @@
 import 'golden_file.dart';
 
 void main() {
-  FileDescriptorProto fd;
+  late FileDescriptorProto fd;
   EnumDescriptorProto ed;
-  DescriptorProto md;
+  late DescriptorProto md;
   setUp(() async {
     fd = FileDescriptorProto();
     ed = EnumDescriptorProto()
@@ -76,11 +74,12 @@
       ..enumType.add(ed);
   });
   test('testMessageGenerator', () {
-    var options =
-        parseGenerationOptions(CodeGeneratorRequest(), CodeGeneratorResponse());
+    var options = parseGenerationOptions(
+        CodeGeneratorRequest(), CodeGeneratorResponse())!;
 
-    var fg = FileGenerator(fd, options);
-    var mg = MessageGenerator.topLevel(md, fg, {}, null, <String>{}, 0);
+    FileGenerator fg = FileGenerator(fd, options);
+    MessageGenerator mg =
+        MessageGenerator.topLevel(md, fg, {}, null, <String>{}, 0);
 
     var ctx = GenerationContext(options);
     mg.register(ctx);
@@ -101,10 +100,11 @@
   });
 
   test('testMetadataIndices', () {
-    var options =
-        parseGenerationOptions(CodeGeneratorRequest(), CodeGeneratorResponse());
-    var fg = FileGenerator(fd, options);
-    var mg = MessageGenerator.topLevel(md, fg, {}, null, <String>{}, 0);
+    var options = parseGenerationOptions(
+        CodeGeneratorRequest(), CodeGeneratorResponse())!;
+    FileGenerator fg = FileGenerator(fd, options);
+    MessageGenerator mg =
+        MessageGenerator.topLevel(md, fg, {}, null, <String>{}, 0);
 
     var ctx = GenerationContext(options);
     mg.register(ctx);
diff --git a/protoc_plugin/test/names_test.dart b/protoc_plugin/test/names_test.dart
index 4e1adf3..9fa3a0d 100644
--- a/protoc_plugin/test/names_test.dart
+++ b/protoc_plugin/test/names_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 import 'package:protoc_plugin/names.dart' as names;
 import 'package:protoc_plugin/src/generated/dart_options.pb.dart';
 import 'package:protoc_plugin/src/generated/descriptor.pb.dart';
@@ -220,7 +218,7 @@
   });
 
   test('The proto name is set correctly', () {
-    expect(json_name.JsonNamedMessage().info_.byName['barName'].protoName,
+    expect(json_name.JsonNamedMessage().info_.byName['barName']!.protoName,
         'foo_name');
   });
 
diff --git a/protoc_plugin/test/protoc_options_test.dart b/protoc_plugin/test/protoc_options_test.dart
index f463b94..f197efb 100644
--- a/protoc_plugin/test/protoc_options_test.dart
+++ b/protoc_plugin/test/protoc_options_test.dart
@@ -3,15 +3,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 import 'package:protoc_plugin/src/generated/plugin.pb.dart';
 import 'package:protoc_plugin/src/options.dart';
 import 'package:test/test.dart';
 
 void main() {
   test('testValidGeneratorOptions', () {
-    void checkValid(String parameter) {
+    void checkValid(String? parameter) {
       var request = CodeGeneratorRequest();
       if (parameter != null) request.parameter = parameter;
       var response = CodeGeneratorResponse();
@@ -28,9 +26,9 @@
   });
 
   test('testInvalidGeneratorOptions', () {
-    void checkInvalid(String parameter) {
+    checkInvalid(String parameter) {
       var request = CodeGeneratorRequest();
-      if (parameter != null) request.parameter = parameter;
+      request.parameter = parameter;
       var response = CodeGeneratorResponse();
       var options = parseGenerationOptions(request, response);
       expect(options, isNull);
diff --git a/protoc_plugin/test/service_generator_test.dart b/protoc_plugin/test/service_generator_test.dart
index 5dc0214..388a78a 100644
--- a/protoc_plugin/test/service_generator_test.dart
+++ b/protoc_plugin/test/service_generator_test.dart
@@ -3,8 +3,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 import 'package:protoc_plugin/indenting_writer.dart';
 import 'package:protoc_plugin/protoc.dart';
 import 'package:protoc_plugin/src/linker.dart';
diff --git a/protoc_plugin/test/validate_fail_test.dart b/protoc_plugin/test/validate_fail_test.dart
index 5c04584..5dde01e 100755
--- a/protoc_plugin/test/validate_fail_test.dart
+++ b/protoc_plugin/test/validate_fail_test.dart
@@ -3,8 +3,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.11
-
 import 'package:fixnum/fixnum.dart';
 import 'package:test/test.dart';
 
@@ -25,10 +23,6 @@
     var builder = TestAllTypes();
 
     expect(() {
-      builder.optionalInt32 = null;
-    }, throwsArgumentError);
-
-    expect(() {
       builder.optionalInt32 = cast('101') as int;
     }, badArgument);
     expect(() {
