diff --git a/protobuf/lib/src/protobuf/field_set.dart b/protobuf/lib/src/protobuf/field_set.dart
index 368ca90..82511dc 100644
--- a/protobuf/lib/src/protobuf/field_set.dart
+++ b/protobuf/lib/src/protobuf/field_set.dart
@@ -103,12 +103,12 @@
 
   static List _makeValueList(int length) {
     if (length == 0) return _zeroList;
-    return List(length);
+    return List.filled(length, null, growable: false);
   }
 
   // Use a fixed length list and not a constant list to ensure that _values
   // always has the same implementation type.
-  static final List _zeroList = List(0);
+  static final List _zeroList = [];
 
   // Metadata about multiple fields
 
diff --git a/protoc_plugin/CHANGELOG.md b/protoc_plugin/CHANGELOG.md
index 51c9dab..0405d5f 100644
--- a/protoc_plugin/CHANGELOG.md
+++ b/protoc_plugin/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 19.3.0
+
+* Generate constructors with optional named arguments for prefilling fields.
+* Output language version 2.7 in generated files to support extension methods.
 ## 19.2.1
 
 * Support optional proto3 fields.
diff --git a/protoc_plugin/lib/file_generator.dart b/protoc_plugin/lib/file_generator.dart
index f3fe706..f985c64 100644
--- a/protoc_plugin/lib/file_generator.dart
+++ b/protoc_plugin/lib/file_generator.dart
@@ -559,7 +559,7 @@
 //  Generated code. Do not modify.
 //  source: ${descriptor.name}
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 ''');
   }
diff --git a/protoc_plugin/lib/names.dart b/protoc_plugin/lib/names.dart
index 2db6ce5..b93d79e 100644
--- a/protoc_plugin/lib/names.dart
+++ b/protoc_plugin/lib/names.dart
@@ -258,7 +258,7 @@
 
   var existingNames = <String>{}..addAll(reservedMemberNames)..addAll(reserved);
 
-  var fieldNames = List<FieldNames>(indexes.length);
+  var fieldNames = List<FieldNames>.filled(indexes.length, null);
 
   void takeFieldNames(FieldNames chosen) {
     fieldNames[chosen.index] = chosen;
diff --git a/protoc_plugin/lib/src/dart_options.pb.dart b/protoc_plugin/lib/src/dart_options.pb.dart
index 37712e1..4f1acc1 100644
--- a/protoc_plugin/lib/src/dart_options.pb.dart
+++ b/protoc_plugin/lib/src/dart_options.pb.dart
@@ -2,7 +2,7 @@
 //  Generated code. Do not modify.
 //  source: dart_options.proto
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
 import 'dart:core' as $core;
@@ -37,7 +37,23 @@
     ..hasRequiredFields = false;
 
   DartMixin._() : super();
-  factory DartMixin() => create();
+  factory DartMixin({
+    $core.String name,
+    $core.String importFrom,
+    $core.String parent,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name = name;
+    }
+    if (importFrom != null) {
+      _result.importFrom = importFrom;
+    }
+    if (parent != null) {
+      _result.parent = parent;
+    }
+    return _result;
+  }
   factory DartMixin.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -121,7 +137,15 @@
     ..hasRequiredFields = false;
 
   Imports._() : super();
-  factory Imports() => create();
+  factory Imports({
+    $core.Iterable<DartMixin> mixins,
+  }) {
+    final _result = create();
+    if (mixins != null) {
+      _result.mixins.addAll(mixins);
+    }
+    return _result;
+  }
   factory Imports.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
diff --git a/protoc_plugin/lib/src/descriptor.pb.dart b/protoc_plugin/lib/src/descriptor.pb.dart
index e5f71ac..b50be81 100644
--- a/protoc_plugin/lib/src/descriptor.pb.dart
+++ b/protoc_plugin/lib/src/descriptor.pb.dart
@@ -2,7 +2,7 @@
 //  Generated code. Do not modify.
 //  source: descriptor.proto
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
 import 'dart:core' as $core;
@@ -33,7 +33,15 @@
         subBuilder: FileDescriptorProto.create);
 
   FileDescriptorSet._() : super();
-  factory FileDescriptorSet() => create();
+  factory FileDescriptorSet({
+    $core.Iterable<FileDescriptorProto> file,
+  }) {
+    final _result = create();
+    if (file != null) {
+      _result.file.addAll(file);
+    }
+    return _result;
+  }
   factory FileDescriptorSet.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -101,7 +109,59 @@
     ..aOS(12, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'syntax');
 
   FileDescriptorProto._() : super();
-  factory FileDescriptorProto() => create();
+  factory FileDescriptorProto({
+    $core.String name,
+    $core.String package,
+    $core.Iterable<$core.String> dependency,
+    $core.Iterable<DescriptorProto> messageType,
+    $core.Iterable<EnumDescriptorProto> enumType,
+    $core.Iterable<ServiceDescriptorProto> service,
+    $core.Iterable<FieldDescriptorProto> extension,
+    FileOptions options,
+    SourceCodeInfo sourceCodeInfo,
+    $core.Iterable<$core.int> publicDependency,
+    $core.Iterable<$core.int> weakDependency,
+    $core.String syntax,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name = name;
+    }
+    if (package != null) {
+      _result.package = package;
+    }
+    if (dependency != null) {
+      _result.dependency.addAll(dependency);
+    }
+    if (messageType != null) {
+      _result.messageType.addAll(messageType);
+    }
+    if (enumType != null) {
+      _result.enumType.addAll(enumType);
+    }
+    if (service != null) {
+      _result.service.addAll(service);
+    }
+    if (extension != null) {
+      _result.extension.addAll(extension);
+    }
+    if (options != null) {
+      _result.options = options;
+    }
+    if (sourceCodeInfo != null) {
+      _result.sourceCodeInfo = sourceCodeInfo;
+    }
+    if (publicDependency != null) {
+      _result.publicDependency.addAll(publicDependency);
+    }
+    if (weakDependency != null) {
+      _result.weakDependency.addAll(weakDependency);
+    }
+    if (syntax != null) {
+      _result.syntax = syntax;
+    }
+    return _result;
+  }
   factory FileDescriptorProto.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -242,7 +302,23 @@
         subBuilder: ExtensionRangeOptions.create);
 
   DescriptorProto_ExtensionRange._() : super();
-  factory DescriptorProto_ExtensionRange() => create();
+  factory DescriptorProto_ExtensionRange({
+    $core.int start,
+    $core.int end,
+    ExtensionRangeOptions options,
+  }) {
+    final _result = create();
+    if (start != null) {
+      _result.start = start;
+    }
+    if (end != null) {
+      _result.end = end;
+    }
+    if (options != null) {
+      _result.options = options;
+    }
+    return _result;
+  }
   factory DescriptorProto_ExtensionRange.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -337,7 +413,19 @@
     ..hasRequiredFields = false;
 
   DescriptorProto_ReservedRange._() : super();
-  factory DescriptorProto_ReservedRange() => create();
+  factory DescriptorProto_ReservedRange({
+    $core.int start,
+    $core.int end,
+  }) {
+    final _result = create();
+    if (start != null) {
+      _result.start = start;
+    }
+    if (end != null) {
+      _result.end = end;
+    }
+    return _result;
+  }
   factory DescriptorProto_ReservedRange.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -422,7 +510,51 @@
     ..pPS(10, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'reservedName');
 
   DescriptorProto._() : super();
-  factory DescriptorProto() => create();
+  factory DescriptorProto({
+    $core.String name,
+    $core.Iterable<FieldDescriptorProto> field,
+    $core.Iterable<DescriptorProto> nestedType,
+    $core.Iterable<EnumDescriptorProto> enumType,
+    $core.Iterable<DescriptorProto_ExtensionRange> extensionRange,
+    $core.Iterable<FieldDescriptorProto> extension,
+    MessageOptions options,
+    $core.Iterable<OneofDescriptorProto> oneofDecl,
+    $core.Iterable<DescriptorProto_ReservedRange> reservedRange,
+    $core.Iterable<$core.String> reservedName,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name = name;
+    }
+    if (field != null) {
+      _result.field.addAll(field);
+    }
+    if (nestedType != null) {
+      _result.nestedType.addAll(nestedType);
+    }
+    if (enumType != null) {
+      _result.enumType.addAll(enumType);
+    }
+    if (extensionRange != null) {
+      _result.extensionRange.addAll(extensionRange);
+    }
+    if (extension != null) {
+      _result.extension.addAll(extension);
+    }
+    if (options != null) {
+      _result.options = options;
+    }
+    if (oneofDecl != null) {
+      _result.oneofDecl.addAll(oneofDecl);
+    }
+    if (reservedRange != null) {
+      _result.reservedRange.addAll(reservedRange);
+    }
+    if (reservedName != null) {
+      _result.reservedName.addAll(reservedName);
+    }
+    return _result;
+  }
   factory DescriptorProto.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -521,7 +653,15 @@
     ..hasExtensions = true;
 
   ExtensionRangeOptions._() : super();
-  factory ExtensionRangeOptions() => create();
+  factory ExtensionRangeOptions({
+    $core.Iterable<UninterpretedOption> uninterpretedOption,
+  }) {
+    final _result = create();
+    if (uninterpretedOption != null) {
+      _result.uninterpretedOption.addAll(uninterpretedOption);
+    }
+    return _result;
+  }
   factory ExtensionRangeOptions.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -596,7 +736,55 @@
     ..aOB(17, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'proto3Optional');
 
   FieldDescriptorProto._() : super();
-  factory FieldDescriptorProto() => create();
+  factory FieldDescriptorProto({
+    $core.String name,
+    $core.String extendee,
+    $core.int number,
+    FieldDescriptorProto_Label label,
+    FieldDescriptorProto_Type type,
+    $core.String typeName,
+    $core.String defaultValue,
+    FieldOptions options,
+    $core.int oneofIndex,
+    $core.String jsonName,
+    $core.bool proto3Optional,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name = name;
+    }
+    if (extendee != null) {
+      _result.extendee = extendee;
+    }
+    if (number != null) {
+      _result.number = number;
+    }
+    if (label != null) {
+      _result.label = label;
+    }
+    if (type != null) {
+      _result.type = type;
+    }
+    if (typeName != null) {
+      _result.typeName = typeName;
+    }
+    if (defaultValue != null) {
+      _result.defaultValue = defaultValue;
+    }
+    if (options != null) {
+      _result.options = options;
+    }
+    if (oneofIndex != null) {
+      _result.oneofIndex = oneofIndex;
+    }
+    if (jsonName != null) {
+      _result.jsonName = jsonName;
+    }
+    if (proto3Optional != null) {
+      _result.proto3Optional = proto3Optional;
+    }
+    return _result;
+  }
   factory FieldDescriptorProto.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -783,7 +971,19 @@
         subBuilder: OneofOptions.create);
 
   OneofDescriptorProto._() : super();
-  factory OneofDescriptorProto() => create();
+  factory OneofDescriptorProto({
+    $core.String name,
+    OneofOptions options,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name = name;
+    }
+    if (options != null) {
+      _result.options = options;
+    }
+    return _result;
+  }
   factory OneofDescriptorProto.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -864,7 +1064,19 @@
     ..hasRequiredFields = false;
 
   EnumDescriptorProto_EnumReservedRange._() : super();
-  factory EnumDescriptorProto_EnumReservedRange() => create();
+  factory EnumDescriptorProto_EnumReservedRange({
+    $core.int start,
+    $core.int end,
+  }) {
+    final _result = create();
+    if (start != null) {
+      _result.start = start;
+    }
+    if (end != null) {
+      _result.end = end;
+    }
+    return _result;
+  }
   factory EnumDescriptorProto_EnumReservedRange.fromBuffer(
           $core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
@@ -948,7 +1160,31 @@
     ..pPS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'reservedName');
 
   EnumDescriptorProto._() : super();
-  factory EnumDescriptorProto() => create();
+  factory EnumDescriptorProto({
+    $core.String name,
+    $core.Iterable<EnumValueDescriptorProto> value,
+    EnumOptions options,
+    $core.Iterable<EnumDescriptorProto_EnumReservedRange> reservedRange,
+    $core.Iterable<$core.String> reservedName,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name = name;
+    }
+    if (value != null) {
+      _result.value.addAll(value);
+    }
+    if (options != null) {
+      _result.options = options;
+    }
+    if (reservedRange != null) {
+      _result.reservedRange.addAll(reservedRange);
+    }
+    if (reservedName != null) {
+      _result.reservedName.addAll(reservedName);
+    }
+    return _result;
+  }
   factory EnumDescriptorProto.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -1039,7 +1275,23 @@
         subBuilder: EnumValueOptions.create);
 
   EnumValueDescriptorProto._() : super();
-  factory EnumValueDescriptorProto() => create();
+  factory EnumValueDescriptorProto({
+    $core.String name,
+    $core.int number,
+    EnumValueOptions options,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name = name;
+    }
+    if (number != null) {
+      _result.number = number;
+    }
+    if (options != null) {
+      _result.options = options;
+    }
+    return _result;
+  }
   factory EnumValueDescriptorProto.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -1131,7 +1383,23 @@
         subBuilder: ServiceOptions.create);
 
   ServiceDescriptorProto._() : super();
-  factory ServiceDescriptorProto() => create();
+  factory ServiceDescriptorProto({
+    $core.String name,
+    $core.Iterable<MethodDescriptorProto> method,
+    ServiceOptions options,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name = name;
+    }
+    if (method != null) {
+      _result.method.addAll(method);
+    }
+    if (options != null) {
+      _result.options = options;
+    }
+    return _result;
+  }
   factory ServiceDescriptorProto.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -1223,7 +1491,35 @@
     ..aOB(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'serverStreaming');
 
   MethodDescriptorProto._() : super();
-  factory MethodDescriptorProto() => create();
+  factory MethodDescriptorProto({
+    $core.String name,
+    $core.String inputType,
+    $core.String outputType,
+    MethodOptions options,
+    $core.bool clientStreaming,
+    $core.bool serverStreaming,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name = name;
+    }
+    if (inputType != null) {
+      _result.inputType = inputType;
+    }
+    if (outputType != null) {
+      _result.outputType = outputType;
+    }
+    if (options != null) {
+      _result.options = options;
+    }
+    if (clientStreaming != null) {
+      _result.clientStreaming = clientStreaming;
+    }
+    if (serverStreaming != null) {
+      _result.serverStreaming = serverStreaming;
+    }
+    return _result;
+  }
   factory MethodDescriptorProto.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -1378,7 +1674,97 @@
     ..hasExtensions = true;
 
   FileOptions._() : super();
-  factory FileOptions() => create();
+  factory FileOptions({
+    $core.String javaPackage,
+    $core.String javaOuterClassname,
+    FileOptions_OptimizeMode optimizeFor,
+    $core.bool javaMultipleFiles,
+    $core.String goPackage,
+    $core.bool ccGenericServices,
+    $core.bool javaGenericServices,
+    $core.bool pyGenericServices,
+    @$core.Deprecated('This field is deprecated.')
+        $core.bool javaGenerateEqualsAndHash,
+    $core.bool deprecated,
+    $core.bool javaStringCheckUtf8,
+    $core.bool ccEnableArenas,
+    $core.String objcClassPrefix,
+    $core.String csharpNamespace,
+    $core.String swiftPrefix,
+    $core.String phpClassPrefix,
+    $core.String phpNamespace,
+    $core.bool phpGenericServices,
+    $core.String phpMetadataNamespace,
+    $core.String rubyPackage,
+    $core.Iterable<UninterpretedOption> uninterpretedOption,
+  }) {
+    final _result = create();
+    if (javaPackage != null) {
+      _result.javaPackage = javaPackage;
+    }
+    if (javaOuterClassname != null) {
+      _result.javaOuterClassname = javaOuterClassname;
+    }
+    if (optimizeFor != null) {
+      _result.optimizeFor = optimizeFor;
+    }
+    if (javaMultipleFiles != null) {
+      _result.javaMultipleFiles = javaMultipleFiles;
+    }
+    if (goPackage != null) {
+      _result.goPackage = goPackage;
+    }
+    if (ccGenericServices != null) {
+      _result.ccGenericServices = ccGenericServices;
+    }
+    if (javaGenericServices != null) {
+      _result.javaGenericServices = javaGenericServices;
+    }
+    if (pyGenericServices != null) {
+      _result.pyGenericServices = pyGenericServices;
+    }
+    if (javaGenerateEqualsAndHash != null) {
+      // ignore: deprecated_member_use_from_same_package
+      _result.javaGenerateEqualsAndHash = javaGenerateEqualsAndHash;
+    }
+    if (deprecated != null) {
+      _result.deprecated = deprecated;
+    }
+    if (javaStringCheckUtf8 != null) {
+      _result.javaStringCheckUtf8 = javaStringCheckUtf8;
+    }
+    if (ccEnableArenas != null) {
+      _result.ccEnableArenas = ccEnableArenas;
+    }
+    if (objcClassPrefix != null) {
+      _result.objcClassPrefix = objcClassPrefix;
+    }
+    if (csharpNamespace != null) {
+      _result.csharpNamespace = csharpNamespace;
+    }
+    if (swiftPrefix != null) {
+      _result.swiftPrefix = swiftPrefix;
+    }
+    if (phpClassPrefix != null) {
+      _result.phpClassPrefix = phpClassPrefix;
+    }
+    if (phpNamespace != null) {
+      _result.phpNamespace = phpNamespace;
+    }
+    if (phpGenericServices != null) {
+      _result.phpGenericServices = phpGenericServices;
+    }
+    if (phpMetadataNamespace != null) {
+      _result.phpMetadataNamespace = phpMetadataNamespace;
+    }
+    if (rubyPackage != null) {
+      _result.rubyPackage = rubyPackage;
+    }
+    if (uninterpretedOption != null) {
+      _result.uninterpretedOption.addAll(uninterpretedOption);
+    }
+    return _result;
+  }
   factory FileOptions.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -1684,7 +2070,31 @@
     ..hasExtensions = true;
 
   MessageOptions._() : super();
-  factory MessageOptions() => create();
+  factory MessageOptions({
+    $core.bool messageSetWireFormat,
+    $core.bool noStandardDescriptorAccessor,
+    $core.bool deprecated,
+    $core.bool mapEntry,
+    $core.Iterable<UninterpretedOption> uninterpretedOption,
+  }) {
+    final _result = create();
+    if (messageSetWireFormat != null) {
+      _result.messageSetWireFormat = messageSetWireFormat;
+    }
+    if (noStandardDescriptorAccessor != null) {
+      _result.noStandardDescriptorAccessor = noStandardDescriptorAccessor;
+    }
+    if (deprecated != null) {
+      _result.deprecated = deprecated;
+    }
+    if (mapEntry != null) {
+      _result.mapEntry = mapEntry;
+    }
+    if (uninterpretedOption != null) {
+      _result.uninterpretedOption.addAll(uninterpretedOption);
+    }
+    return _result;
+  }
   factory MessageOptions.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -1793,7 +2203,39 @@
     ..hasExtensions = true;
 
   FieldOptions._() : super();
-  factory FieldOptions() => create();
+  factory FieldOptions({
+    FieldOptions_CType ctype,
+    $core.bool packed,
+    $core.bool deprecated,
+    $core.bool lazy,
+    FieldOptions_JSType jstype,
+    $core.bool weak,
+    $core.Iterable<UninterpretedOption> uninterpretedOption,
+  }) {
+    final _result = create();
+    if (ctype != null) {
+      _result.ctype = ctype;
+    }
+    if (packed != null) {
+      _result.packed = packed;
+    }
+    if (deprecated != null) {
+      _result.deprecated = deprecated;
+    }
+    if (lazy != null) {
+      _result.lazy = lazy;
+    }
+    if (jstype != null) {
+      _result.jstype = jstype;
+    }
+    if (weak != null) {
+      _result.weak = weak;
+    }
+    if (uninterpretedOption != null) {
+      _result.uninterpretedOption.addAll(uninterpretedOption);
+    }
+    return _result;
+  }
   factory FieldOptions.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -1917,7 +2359,15 @@
     ..hasExtensions = true;
 
   OneofOptions._() : super();
-  factory OneofOptions() => create();
+  factory OneofOptions({
+    $core.Iterable<UninterpretedOption> uninterpretedOption,
+  }) {
+    final _result = create();
+    if (uninterpretedOption != null) {
+      _result.uninterpretedOption.addAll(uninterpretedOption);
+    }
+    return _result;
+  }
   factory OneofOptions.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -1979,7 +2429,23 @@
     ..hasExtensions = true;
 
   EnumOptions._() : super();
-  factory EnumOptions() => create();
+  factory EnumOptions({
+    $core.bool allowAlias,
+    $core.bool deprecated,
+    $core.Iterable<UninterpretedOption> uninterpretedOption,
+  }) {
+    final _result = create();
+    if (allowAlias != null) {
+      _result.allowAlias = allowAlias;
+    }
+    if (deprecated != null) {
+      _result.deprecated = deprecated;
+    }
+    if (uninterpretedOption != null) {
+      _result.uninterpretedOption.addAll(uninterpretedOption);
+    }
+    return _result;
+  }
   factory EnumOptions.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -2059,7 +2525,19 @@
     ..hasExtensions = true;
 
   EnumValueOptions._() : super();
-  factory EnumValueOptions() => create();
+  factory EnumValueOptions({
+    $core.bool deprecated,
+    $core.Iterable<UninterpretedOption> uninterpretedOption,
+  }) {
+    final _result = create();
+    if (deprecated != null) {
+      _result.deprecated = deprecated;
+    }
+    if (uninterpretedOption != null) {
+      _result.uninterpretedOption.addAll(uninterpretedOption);
+    }
+    return _result;
+  }
   factory EnumValueOptions.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -2128,7 +2606,19 @@
     ..hasExtensions = true;
 
   ServiceOptions._() : super();
-  factory ServiceOptions() => create();
+  factory ServiceOptions({
+    $core.bool deprecated,
+    $core.Iterable<UninterpretedOption> uninterpretedOption,
+  }) {
+    final _result = create();
+    if (deprecated != null) {
+      _result.deprecated = deprecated;
+    }
+    if (uninterpretedOption != null) {
+      _result.uninterpretedOption.addAll(uninterpretedOption);
+    }
+    return _result;
+  }
   factory ServiceOptions.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -2200,7 +2690,23 @@
         ..hasExtensions = true;
 
   MethodOptions._() : super();
-  factory MethodOptions() => create();
+  factory MethodOptions({
+    $core.bool deprecated,
+    MethodOptions_IdempotencyLevel idempotencyLevel,
+    $core.Iterable<UninterpretedOption> uninterpretedOption,
+  }) {
+    final _result = create();
+    if (deprecated != null) {
+      _result.deprecated = deprecated;
+    }
+    if (idempotencyLevel != null) {
+      _result.idempotencyLevel = idempotencyLevel;
+    }
+    if (uninterpretedOption != null) {
+      _result.uninterpretedOption.addAll(uninterpretedOption);
+    }
+    return _result;
+  }
   factory MethodOptions.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -2279,7 +2785,19 @@
         $pb.PbFieldType.QB);
 
   UninterpretedOption_NamePart._() : super();
-  factory UninterpretedOption_NamePart() => create();
+  factory UninterpretedOption_NamePart({
+    $core.String namePart,
+    $core.bool isExtension,
+  }) {
+    final _result = create();
+    if (namePart != null) {
+      _result.namePart = namePart;
+    }
+    if (isExtension != null) {
+      _result.isExtension = isExtension;
+    }
+    return _result;
+  }
   factory UninterpretedOption_NamePart.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -2360,7 +2878,39 @@
     ..aOS(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'aggregateValue');
 
   UninterpretedOption._() : super();
-  factory UninterpretedOption() => create();
+  factory UninterpretedOption({
+    $core.Iterable<UninterpretedOption_NamePart> name,
+    $core.String identifierValue,
+    $fixnum.Int64 positiveIntValue,
+    $fixnum.Int64 negativeIntValue,
+    $core.double doubleValue,
+    $core.List<$core.int> stringValue,
+    $core.String aggregateValue,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name.addAll(name);
+    }
+    if (identifierValue != null) {
+      _result.identifierValue = identifierValue;
+    }
+    if (positiveIntValue != null) {
+      _result.positiveIntValue = positiveIntValue;
+    }
+    if (negativeIntValue != null) {
+      _result.negativeIntValue = negativeIntValue;
+    }
+    if (doubleValue != null) {
+      _result.doubleValue = doubleValue;
+    }
+    if (stringValue != null) {
+      _result.stringValue = stringValue;
+    }
+    if (aggregateValue != null) {
+      _result.aggregateValue = aggregateValue;
+    }
+    return _result;
+  }
   factory UninterpretedOption.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -2493,7 +3043,31 @@
     ..hasRequiredFields = false;
 
   SourceCodeInfo_Location._() : super();
-  factory SourceCodeInfo_Location() => create();
+  factory SourceCodeInfo_Location({
+    $core.Iterable<$core.int> path,
+    $core.Iterable<$core.int> span,
+    $core.String leadingComments,
+    $core.String trailingComments,
+    $core.Iterable<$core.String> leadingDetachedComments,
+  }) {
+    final _result = create();
+    if (path != null) {
+      _result.path.addAll(path);
+    }
+    if (span != null) {
+      _result.span.addAll(span);
+    }
+    if (leadingComments != null) {
+      _result.leadingComments = leadingComments;
+    }
+    if (trailingComments != null) {
+      _result.trailingComments = trailingComments;
+    }
+    if (leadingDetachedComments != null) {
+      _result.leadingDetachedComments.addAll(leadingDetachedComments);
+    }
+    return _result;
+  }
   factory SourceCodeInfo_Location.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -2577,7 +3151,15 @@
     ..hasRequiredFields = false;
 
   SourceCodeInfo._() : super();
-  factory SourceCodeInfo() => create();
+  factory SourceCodeInfo({
+    $core.Iterable<SourceCodeInfo_Location> location,
+  }) {
+    final _result = create();
+    if (location != null) {
+      _result.location.addAll(location);
+    }
+    return _result;
+  }
   factory SourceCodeInfo.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -2638,7 +3220,27 @@
     ..hasRequiredFields = false;
 
   GeneratedCodeInfo_Annotation._() : super();
-  factory GeneratedCodeInfo_Annotation() => create();
+  factory GeneratedCodeInfo_Annotation({
+    $core.Iterable<$core.int> path,
+    $core.String sourceFile,
+    $core.int begin,
+    $core.int end,
+  }) {
+    final _result = create();
+    if (path != null) {
+      _result.path.addAll(path);
+    }
+    if (sourceFile != null) {
+      _result.sourceFile = sourceFile;
+    }
+    if (begin != null) {
+      _result.begin = begin;
+    }
+    if (end != null) {
+      _result.end = end;
+    }
+    return _result;
+  }
   factory GeneratedCodeInfo_Annotation.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -2729,7 +3331,15 @@
     ..hasRequiredFields = false;
 
   GeneratedCodeInfo._() : super();
-  factory GeneratedCodeInfo() => create();
+  factory GeneratedCodeInfo({
+    $core.Iterable<GeneratedCodeInfo_Annotation> annotation,
+  }) {
+    final _result = create();
+    if (annotation != null) {
+      _result.annotation.addAll(annotation);
+    }
+    return _result;
+  }
   factory GeneratedCodeInfo.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
diff --git a/protoc_plugin/lib/src/descriptor.pbenum.dart b/protoc_plugin/lib/src/descriptor.pbenum.dart
index 5dc79eb..e2d0c97 100644
--- a/protoc_plugin/lib/src/descriptor.pbenum.dart
+++ b/protoc_plugin/lib/src/descriptor.pbenum.dart
@@ -2,7 +2,7 @@
 //  Generated code. Do not modify.
 //  source: descriptor.proto
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
 // ignore_for_file: UNDEFINED_SHOWN_NAME
diff --git a/protoc_plugin/lib/src/plugin.pb.dart b/protoc_plugin/lib/src/plugin.pb.dart
index a1c355e..f2ef929 100644
--- a/protoc_plugin/lib/src/plugin.pb.dart
+++ b/protoc_plugin/lib/src/plugin.pb.dart
@@ -2,7 +2,7 @@
 //  Generated code. Do not modify.
 //  source: plugin.proto
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
 import 'dart:core' as $core;
@@ -44,7 +44,27 @@
     ..hasRequiredFields = false;
 
   Version._() : super();
-  factory Version() => create();
+  factory Version({
+    $core.int major,
+    $core.int minor,
+    $core.int patch,
+    $core.String suffix,
+  }) {
+    final _result = create();
+    if (major != null) {
+      _result.major = major;
+    }
+    if (minor != null) {
+      _result.minor = minor;
+    }
+    if (patch != null) {
+      _result.patch = patch;
+    }
+    if (suffix != null) {
+      _result.suffix = suffix;
+    }
+    return _result;
+  }
   factory Version.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -148,7 +168,27 @@
         subBuilder: $0.FileDescriptorProto.create);
 
   CodeGeneratorRequest._() : super();
-  factory CodeGeneratorRequest() => create();
+  factory CodeGeneratorRequest({
+    $core.Iterable<$core.String> fileToGenerate,
+    $core.String parameter,
+    Version compilerVersion,
+    $core.Iterable<$0.FileDescriptorProto> protoFile,
+  }) {
+    final _result = create();
+    if (fileToGenerate != null) {
+      _result.fileToGenerate.addAll(fileToGenerate);
+    }
+    if (parameter != null) {
+      _result.parameter = parameter;
+    }
+    if (compilerVersion != null) {
+      _result.compilerVersion = compilerVersion;
+    }
+    if (protoFile != null) {
+      _result.protoFile.addAll(protoFile);
+    }
+    return _result;
+  }
   factory CodeGeneratorRequest.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -241,7 +281,27 @@
     ..hasRequiredFields = false;
 
   CodeGeneratorResponse_File._() : super();
-  factory CodeGeneratorResponse_File() => create();
+  factory CodeGeneratorResponse_File({
+    $core.String name,
+    $core.String insertionPoint,
+    $core.String content,
+    $0.GeneratedCodeInfo generatedCodeInfo,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name = name;
+    }
+    if (insertionPoint != null) {
+      _result.insertionPoint = insertionPoint;
+    }
+    if (content != null) {
+      _result.content = content;
+    }
+    if (generatedCodeInfo != null) {
+      _result.generatedCodeInfo = generatedCodeInfo;
+    }
+    return _result;
+  }
   factory CodeGeneratorResponse_File.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
@@ -347,7 +407,23 @@
     ..hasRequiredFields = false;
 
   CodeGeneratorResponse._() : super();
-  factory CodeGeneratorResponse() => create();
+  factory CodeGeneratorResponse({
+    $core.String error,
+    $fixnum.Int64 supportedFeatures,
+    $core.Iterable<CodeGeneratorResponse_File> file,
+  }) {
+    final _result = create();
+    if (error != null) {
+      _result.error = error;
+    }
+    if (supportedFeatures != null) {
+      _result.supportedFeatures = supportedFeatures;
+    }
+    if (file != null) {
+      _result.file.addAll(file);
+    }
+    return _result;
+  }
   factory CodeGeneratorResponse.fromBuffer($core.List<$core.int> i,
           [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
       create()..mergeFromBuffer(i, r);
diff --git a/protoc_plugin/lib/src/plugin.pbenum.dart b/protoc_plugin/lib/src/plugin.pbenum.dart
index 11ee3a2..bdb52eb 100644
--- a/protoc_plugin/lib/src/plugin.pbenum.dart
+++ b/protoc_plugin/lib/src/plugin.pbenum.dart
@@ -2,7 +2,7 @@
 //  Generated code. Do not modify.
 //  source: plugin.proto
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
 // ignore_for_file: UNDEFINED_SHOWN_NAME
diff --git a/protoc_plugin/pubspec.yaml b/protoc_plugin/pubspec.yaml
index f085ce7..49562ba 100644
--- a/protoc_plugin/pubspec.yaml
+++ b/protoc_plugin/pubspec.yaml
@@ -1,5 +1,5 @@
 name: protoc_plugin
-version: 19.2.1
+version: 19.3.0
 description: Protoc compiler plugin to generate Dart code
 homepage: https://github.com/dart-lang/protobuf
 
diff --git a/protoc_plugin/test/generated_message_test.dart b/protoc_plugin/test/generated_message_test.dart
index 34359cb..b850b16 100755
--- a/protoc_plugin/test/generated_message_test.dart
+++ b/protoc_plugin/test/generated_message_test.dart
@@ -308,10 +308,7 @@
 
   test('testReadHugeBlob', () {
     // Allocate and initialize a 1MB blob.
-    var blob = List<int>(1 << 20);
-    for (var i = 0; i < blob.length; i++) {
-      blob[i] = i % 256;
-    }
+    var blob = List<int>.generate(1 << 20, (i) => i % 256);
 
     // Make a message containing it.
     var message = getAllSet();
diff --git a/protoc_plugin/test/goldens/grpc_service.pb b/protoc_plugin/test/goldens/grpc_service.pb
index 1e0e794..9f9b875 100644
--- a/protoc_plugin/test/goldens/grpc_service.pb
+++ b/protoc_plugin/test/goldens/grpc_service.pb
@@ -2,7 +2,7 @@
 //  Generated code. Do not modify.
 //  source: test
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
 import 'dart:core' as $core;
diff --git a/protoc_plugin/test/goldens/grpc_service.pbgrpc b/protoc_plugin/test/goldens/grpc_service.pbgrpc
index 6cb0095..34d1583 100644
--- a/protoc_plugin/test/goldens/grpc_service.pbgrpc
+++ b/protoc_plugin/test/goldens/grpc_service.pbgrpc
@@ -2,7 +2,7 @@
 //  Generated code. Do not modify.
 //  source: test
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
 import 'dart:async' as $async;
diff --git a/protoc_plugin/test/goldens/header_in_package.pb b/protoc_plugin/test/goldens/header_in_package.pb
index 93b7768..301c76a 100644
--- a/protoc_plugin/test/goldens/header_in_package.pb
+++ b/protoc_plugin/test/goldens/header_in_package.pb
@@ -2,7 +2,7 @@
 //  Generated code. Do not modify.
 //  source: test
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
 import 'dart:core' as $core;
diff --git a/protoc_plugin/test/goldens/header_with_fixnum.pb b/protoc_plugin/test/goldens/header_with_fixnum.pb
index ed21dac..1c65247 100644
--- a/protoc_plugin/test/goldens/header_with_fixnum.pb
+++ b/protoc_plugin/test/goldens/header_with_fixnum.pb
@@ -2,7 +2,7 @@
 //  Generated code. Do not modify.
 //  source: test
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
 import 'dart:core' as $core;
diff --git a/protoc_plugin/test/goldens/imports.pb b/protoc_plugin/test/goldens/imports.pb
index 3168eda..0db6fa8 100644
--- a/protoc_plugin/test/goldens/imports.pb
+++ b/protoc_plugin/test/goldens/imports.pb
@@ -2,7 +2,7 @@
 //  Generated code. Do not modify.
 //  source: test.proto
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
 import 'dart:core' as $core;
diff --git a/protoc_plugin/test/goldens/imports.pbjson b/protoc_plugin/test/goldens/imports.pbjson
index af2302f..2469b7e 100644
--- a/protoc_plugin/test/goldens/imports.pbjson
+++ b/protoc_plugin/test/goldens/imports.pbjson
@@ -2,6 +2,6 @@
 //  Generated code. Do not modify.
 //  source: test.proto
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
diff --git a/protoc_plugin/test/goldens/int64.pb b/protoc_plugin/test/goldens/int64.pb
index ee98cb5..6b1d79d 100644
--- a/protoc_plugin/test/goldens/int64.pb
+++ b/protoc_plugin/test/goldens/int64.pb
@@ -2,7 +2,7 @@
 //  Generated code. Do not modify.
 //  source: test
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
 import 'dart:core' as $core;
diff --git a/protoc_plugin/test/goldens/oneMessage.pb b/protoc_plugin/test/goldens/oneMessage.pb
index 2a79ae9..54adfae 100644
--- a/protoc_plugin/test/goldens/oneMessage.pb
+++ b/protoc_plugin/test/goldens/oneMessage.pb
@@ -2,7 +2,7 @@
 //  Generated code. Do not modify.
 //  source: test
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
 import 'dart:core' as $core;
diff --git a/protoc_plugin/test/goldens/oneMessage.pbjson b/protoc_plugin/test/goldens/oneMessage.pbjson
index ec18d1d..0cac887 100644
--- a/protoc_plugin/test/goldens/oneMessage.pbjson
+++ b/protoc_plugin/test/goldens/oneMessage.pbjson
@@ -2,7 +2,7 @@
 //  Generated code. Do not modify.
 //  source: test
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
 const PhoneNumber$json = const {
diff --git a/protoc_plugin/test/goldens/service.pb b/protoc_plugin/test/goldens/service.pb
index ee31274..32d53ac 100644
--- a/protoc_plugin/test/goldens/service.pb
+++ b/protoc_plugin/test/goldens/service.pb
@@ -2,7 +2,7 @@
 //  Generated code. Do not modify.
 //  source: test
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
 import 'dart:async' as $async;
diff --git a/protoc_plugin/test/goldens/service.pbserver b/protoc_plugin/test/goldens/service.pbserver
index b776578..66d6e79 100644
--- a/protoc_plugin/test/goldens/service.pbserver
+++ b/protoc_plugin/test/goldens/service.pbserver
@@ -2,7 +2,7 @@
 //  Generated code. Do not modify.
 //  source: test
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
 import 'dart:async' as $async;
diff --git a/protoc_plugin/test/goldens/serviceGenerator.pb.json b/protoc_plugin/test/goldens/serviceGenerator.pb.json
index 7629c08..7a33efe 100644
--- a/protoc_plugin/test/goldens/serviceGenerator.pb.json
+++ b/protoc_plugin/test/goldens/serviceGenerator.pb.json
@@ -2,7 +2,7 @@
 //  Generated code. Do not modify.
 //  source: testpkg.proto
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
 import 'foobar.pbjson.dart' as $1;
diff --git a/protoc_plugin/test/goldens/topLevelEnum.pb b/protoc_plugin/test/goldens/topLevelEnum.pb
index bbbd5d5..d94d99f 100644
--- a/protoc_plugin/test/goldens/topLevelEnum.pb
+++ b/protoc_plugin/test/goldens/topLevelEnum.pb
@@ -2,7 +2,7 @@
 //  Generated code. Do not modify.
 //  source: test
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
 import 'dart:core' as $core;
diff --git a/protoc_plugin/test/goldens/topLevelEnum.pbenum b/protoc_plugin/test/goldens/topLevelEnum.pbenum
index 09840da..98f5b86 100644
--- a/protoc_plugin/test/goldens/topLevelEnum.pbenum
+++ b/protoc_plugin/test/goldens/topLevelEnum.pbenum
@@ -2,7 +2,7 @@
 //  Generated code. Do not modify.
 //  source: test
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
 // ignore_for_file: UNDEFINED_SHOWN_NAME
diff --git a/protoc_plugin/test/goldens/topLevelEnum.pbjson b/protoc_plugin/test/goldens/topLevelEnum.pbjson
index 869bf1f..6a549fb 100644
--- a/protoc_plugin/test/goldens/topLevelEnum.pbjson
+++ b/protoc_plugin/test/goldens/topLevelEnum.pbjson
@@ -2,7 +2,7 @@
 //  Generated code. Do not modify.
 //  source: test
 //
-// @dart = 2.3
+// @dart = 2.7
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
 const PhoneType$json = const {
