[file_selector] Convert XTypeGroup to const (#6476)

diff --git a/packages/file_selector/file_selector_platform_interface/CHANGELOG.md b/packages/file_selector/file_selector_platform_interface/CHANGELOG.md
index c4ee86a..ad1fe2c 100644
--- a/packages/file_selector/file_selector_platform_interface/CHANGELOG.md
+++ b/packages/file_selector/file_selector_platform_interface/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.2.0
+
+* Makes `XTypeGroup`'s constructor constant.
+
 ## 2.1.1
 
 * Updates imports for `prefer_relative_imports`.
diff --git a/packages/file_selector/file_selector_platform_interface/lib/src/types/x_type_group/x_type_group.dart b/packages/file_selector/file_selector_platform_interface/lib/src/types/x_type_group/x_type_group.dart
index 506dc1c..00cd565 100644
--- a/packages/file_selector/file_selector_platform_interface/lib/src/types/x_type_group/x_type_group.dart
+++ b/packages/file_selector/file_selector_platform_interface/lib/src/types/x_type_group/x_type_group.dart
@@ -1,37 +1,43 @@
 // Copyright 2013 The Flutter Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
+import 'package:flutter/foundation.dart' show immutable;
 
-/// A set of allowed XTypes
+/// A set of allowed XTypes.
+@immutable
 class XTypeGroup {
   /// Creates a new group with the given label and file extensions.
   ///
   /// A group with none of the type options provided indicates that any type is
   /// allowed.
-  XTypeGroup({
+  const XTypeGroup({
     this.label,
     List<String>? extensions,
     this.mimeTypes,
     this.macUTIs,
     this.webWildCards,
-  }) : extensions = _removeLeadingDots(extensions);
+  }) : _extensions = extensions;
 
-  /// The 'name' or reference to this group of types
+  /// The 'name' or reference to this group of types.
   final String? label;
 
-  /// The extensions for this group
-  final List<String>? extensions;
-
-  /// The MIME types for this group
+  /// The MIME types for this group.
   final List<String>? mimeTypes;
 
-  /// The UTIs for this group
+  /// The UTIs for this group.
   final List<String>? macUTIs;
 
-  /// The web wild cards for this group (ex: image/*, video/*)
+  /// The web wild cards for this group (ex: image/*, video/*).
   final List<String>? webWildCards;
 
-  /// Converts this object into a JSON formatted object
+  final List<String>? _extensions;
+
+  /// The extensions for this group.
+  List<String>? get extensions {
+    return _removeLeadingDots(_extensions);
+  }
+
+  /// Converts this object into a JSON formatted object.
   Map<String, dynamic> toJSON() {
     return <String, dynamic>{
       'label': label,
diff --git a/packages/file_selector/file_selector_platform_interface/pubspec.yaml b/packages/file_selector/file_selector_platform_interface/pubspec.yaml
index b01af35..c450006 100644
--- a/packages/file_selector/file_selector_platform_interface/pubspec.yaml
+++ b/packages/file_selector/file_selector_platform_interface/pubspec.yaml
@@ -4,7 +4,7 @@
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+file_selector%22
 # NOTE: We strongly prefer non-breaking changes, even at the expense of a
 # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
-version: 2.1.1
+version: 2.2.0
 
 environment:
   sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/file_selector/file_selector_platform_interface/test/method_channel_file_selector_test.dart b/packages/file_selector/file_selector_platform_interface/test/method_channel_file_selector_test.dart
index 33f9fbf..0f5f3a1 100644
--- a/packages/file_selector/file_selector_platform_interface/test/method_channel_file_selector_test.dart
+++ b/packages/file_selector/file_selector_platform_interface/test/method_channel_file_selector_test.dart
@@ -26,14 +26,14 @@
 
     group('#openFile', () {
       test('passes the accepted type groups correctly', () async {
-        final XTypeGroup group = XTypeGroup(
+        const XTypeGroup group = XTypeGroup(
           label: 'text',
           extensions: <String>['txt'],
           mimeTypes: <String>['text/plain'],
           macUTIs: <String>['public.text'],
         );
 
-        final XTypeGroup groupTwo = XTypeGroup(
+        const XTypeGroup groupTwo = XTypeGroup(
             label: 'image',
             extensions: <String>['jpg'],
             mimeTypes: <String>['image/jpg'],
@@ -91,14 +91,14 @@
     });
     group('#openFiles', () {
       test('passes the accepted type groups correctly', () async {
-        final XTypeGroup group = XTypeGroup(
+        const XTypeGroup group = XTypeGroup(
           label: 'text',
           extensions: <String>['txt'],
           mimeTypes: <String>['text/plain'],
           macUTIs: <String>['public.text'],
         );
 
-        final XTypeGroup groupTwo = XTypeGroup(
+        const XTypeGroup groupTwo = XTypeGroup(
             label: 'image',
             extensions: <String>['jpg'],
             mimeTypes: <String>['image/jpg'],
@@ -157,14 +157,14 @@
 
     group('#getSavePath', () {
       test('passes the accepted type groups correctly', () async {
-        final XTypeGroup group = XTypeGroup(
+        const XTypeGroup group = XTypeGroup(
           label: 'text',
           extensions: <String>['txt'],
           mimeTypes: <String>['text/plain'],
           macUTIs: <String>['public.text'],
         );
 
-        final XTypeGroup groupTwo = XTypeGroup(
+        const XTypeGroup groupTwo = XTypeGroup(
             label: 'image',
             extensions: <String>['jpg'],
             mimeTypes: <String>['image/jpg'],
diff --git a/packages/file_selector/file_selector_platform_interface/test/x_type_group_test.dart b/packages/file_selector/file_selector_platform_interface/test/x_type_group_test.dart
index e09605c..107cdc3 100644
--- a/packages/file_selector/file_selector_platform_interface/test/x_type_group_test.dart
+++ b/packages/file_selector/file_selector_platform_interface/test/x_type_group_test.dart
@@ -31,7 +31,7 @@
     });
 
     test('A wildcard group can be created', () {
-      final XTypeGroup group = XTypeGroup(
+      const XTypeGroup group = XTypeGroup(
         label: 'Any',
       );
 
@@ -44,7 +44,7 @@
     });
 
     test('allowsAny treats empty arrays the same as null', () {
-      final XTypeGroup group = XTypeGroup(
+      const XTypeGroup group = XTypeGroup(
         label: 'Any',
         extensions: <String>[],
         mimeTypes: <String>[],
@@ -56,13 +56,13 @@
     });
 
     test('allowsAny returns false if anything is set', () {
-      final XTypeGroup extensionOnly =
+      const XTypeGroup extensionOnly =
           XTypeGroup(label: 'extensions', extensions: <String>['txt']);
-      final XTypeGroup mimeOnly =
+      const XTypeGroup mimeOnly =
           XTypeGroup(label: 'mime', mimeTypes: <String>['text/plain']);
-      final XTypeGroup utiOnly =
+      const XTypeGroup utiOnly =
           XTypeGroup(label: 'utis', macUTIs: <String>['public.text']);
-      final XTypeGroup webOnly =
+      const XTypeGroup webOnly =
           XTypeGroup(label: 'web', webWildCards: <String>['.txt']);
 
       expect(extensionOnly.allowsAny, false);