Add const constructor to TextInputFormatter (#116654)

* Add const constructor to TextInputFormatter

* Fix test

* Add abstract

* Add noSuchMethod

Signed-off-by: Shogo Hida <shogo.hida@gmail.com>

* Add @override and void

Signed-off-by: Shogo Hida <shogo.hida@gmail.com>

* Fix text and position of test

Signed-off-by: Shogo Hida <shogo.hida@gmail.com>

Signed-off-by: Shogo Hida <shogo.hida@gmail.com>
diff --git a/packages/flutter/lib/src/services/text_formatter.dart b/packages/flutter/lib/src/services/text_formatter.dart
index d565cc9..8ba5d0d 100644
--- a/packages/flutter/lib/src/services/text_formatter.dart
+++ b/packages/flutter/lib/src/services/text_formatter.dart
@@ -88,6 +88,9 @@
 ///  * [FilteringTextInputFormatter], a provided formatter for filtering
 ///    characters.
 abstract class TextInputFormatter {
+  /// This constructor enables subclasses to provide const constructors so that they can be used in const expressions.
+  const TextInputFormatter();
+
   /// Called when text is being typed or cut/copy/pasted in the [EditableText].
   ///
   /// You can override the resulting text based on the previous text value and
diff --git a/packages/flutter/test/services/text_formatter_test.dart b/packages/flutter/test/services/text_formatter_test.dart
index 088fc28..0202e95 100644
--- a/packages/flutter/test/services/text_formatter_test.dart
+++ b/packages/flutter/test/services/text_formatter_test.dart
@@ -6,10 +6,26 @@
 import 'package:flutter/services.dart';
 import 'package:flutter_test/flutter_test.dart';
 
+class TestTextInputFormatter extends TextInputFormatter {
+  const TestTextInputFormatter();
+
+  @override
+  void noSuchMethod(Invocation invocation) {
+    super.noSuchMethod(invocation);
+  }
+}
+
 void main() {
   TextEditingValue testOldValue = TextEditingValue.empty;
   TextEditingValue testNewValue = TextEditingValue.empty;
 
+  test('test const constructor', () {
+    const TestTextInputFormatter testValue1 = TestTextInputFormatter();
+    const TestTextInputFormatter testValue2 = TestTextInputFormatter();
+
+    expect(testValue1, same(testValue2));
+  });
+
   test('withFunction wraps formatting function', () {
     testOldValue = TextEditingValue.empty;
     testNewValue = TextEditingValue.empty;