From 63062a64432cce03315d6b5196fda7912866eb37 Mon Sep 17 00:00:00 2001 From: Alex Li Date: Sun, 13 Dec 2020 23:19:13 +0800 Subject: [PATCH] Deprecate `maxLengthEnforced` for text fields (#72043) --- .../flutter/lib/src/cupertino/text_field.dart | 17 +++++++++++++- .../flutter/lib/src/material/text_field.dart | 12 +++++++++- .../lib/src/material/text_form_field.dart | 5 ++++ .../lib/src/services/text_formatter.dart | 11 +++++---- .../test/services/text_formatter_test.dart | 23 +++++++++++++++++++ 5 files changed, 62 insertions(+), 6 deletions(-) diff --git a/packages/flutter/lib/src/cupertino/text_field.dart b/packages/flutter/lib/src/cupertino/text_field.dart index 9ba66a7159..49cfa7a9da 100644 --- a/packages/flutter/lib/src/cupertino/text_field.dart +++ b/packages/flutter/lib/src/cupertino/text_field.dart @@ -262,6 +262,11 @@ class CupertinoTextField extends StatefulWidget { this.minLines, this.expands = false, this.maxLength, + @Deprecated( + 'Use maxLengthEnforcement parameter which provides more specific ' + 'behavior related to the maxLength limit. ' + 'This feature was deprecated after v1.25.0-5.0.pre.' + ) this.maxLengthEnforced = true, this.maxLengthEnforcement, this.onChanged, @@ -409,6 +414,11 @@ class CupertinoTextField extends StatefulWidget { this.minLines, this.expands = false, this.maxLength, + @Deprecated( + 'Use maxLengthEnforcement parameter which provides more specific ' + 'behavior related to the maxLength limit. ' + 'This feature was deprecated after v1.25.0-5.0.pre.' + ) this.maxLengthEnforced = true, this.maxLengthEnforcement, this.onChanged, @@ -654,6 +664,11 @@ class CupertinoTextField extends StatefulWidget { /// /// If true, prevents the field from allowing more than [maxLength] /// characters. + @Deprecated( + 'Use maxLengthEnforcement parameter which provides more specific ' + 'behavior related to the maxLength limit. ' + 'This feature was deprecated after v1.25.0-5.0.pre.' + ) final bool maxLengthEnforced; /// Determines how the [maxLength] limit should be enforced. @@ -808,7 +823,7 @@ class _CupertinoTextFieldState extends State with Restoratio FocusNode get _effectiveFocusNode => widget.focusNode ?? (_focusNode ??= FocusNode()); MaxLengthEnforcement get _effectiveMaxLengthEnforcement => widget.maxLengthEnforcement - ?? LengthLimitingTextInputFormatter.inferredDefaultMaxLengthEnforcement; + ?? LengthLimitingTextInputFormatter.getDefaultMaxLengthEnforcement(); bool _showSelectionHandles = false; diff --git a/packages/flutter/lib/src/material/text_field.dart b/packages/flutter/lib/src/material/text_field.dart index d2742573fa..367f41aa12 100644 --- a/packages/flutter/lib/src/material/text_field.dart +++ b/packages/flutter/lib/src/material/text_field.dart @@ -359,6 +359,11 @@ class TextField extends StatefulWidget { this.minLines, this.expands = false, this.maxLength, + @Deprecated( + 'Use maxLengthEnforcement parameter which provides more specific ' + 'behavior related to the maxLength limit. ' + 'This feature was deprecated after v1.25.0-5.0.pre.' + ) this.maxLengthEnforced = true, this.maxLengthEnforcement, this.onChanged, @@ -606,6 +611,11 @@ class TextField extends StatefulWidget { /// /// If true, prevents the field from allowing more than [maxLength] /// characters. + @Deprecated( + 'Use maxLengthEnforcement parameter which provides more specific ' + 'behavior related to the maxLength limit. ' + 'This feature was deprecated after v1.25.0-5.0.pre.' + ) final bool maxLengthEnforced; /// Determines how the [maxLength] limit should be enforced. @@ -856,7 +866,7 @@ class _TextFieldState extends State with RestorationMixin implements FocusNode get _effectiveFocusNode => widget.focusNode ?? (_focusNode ??= FocusNode()); MaxLengthEnforcement get _effectiveMaxLengthEnforcement => widget.maxLengthEnforcement - ?? LengthLimitingTextInputFormatter.inferredDefaultMaxLengthEnforcement; + ?? LengthLimitingTextInputFormatter.getDefaultMaxLengthEnforcement(Theme.of(context).platform); bool _isHovering = false; diff --git a/packages/flutter/lib/src/material/text_form_field.dart b/packages/flutter/lib/src/material/text_form_field.dart index 0e60d52df9..dd77378afd 100644 --- a/packages/flutter/lib/src/material/text_form_field.dart +++ b/packages/flutter/lib/src/material/text_form_field.dart @@ -165,6 +165,11 @@ class TextFormField extends FormField { 'This feature was deprecated after v1.19.0.' ) bool autovalidate = false, + @Deprecated( + 'Use maxLengthEnforcement parameter which provides more specific ' + 'behavior related to the maxLength limit. ' + 'This feature was deprecated after v1.25.0-5.0.pre.' + ) bool maxLengthEnforced = true, MaxLengthEnforcement? maxLengthEnforcement, int? maxLines = 1, diff --git a/packages/flutter/lib/src/services/text_formatter.dart b/packages/flutter/lib/src/services/text_formatter.dart index d1ad8edfe5..c10cc3a699 100644 --- a/packages/flutter/lib/src/services/text_formatter.dart +++ b/packages/flutter/lib/src/services/text_formatter.dart @@ -415,7 +415,8 @@ class LengthLimitingTextInputFormatter extends TextInputFormatter { /// {@macro flutter.services.textFormatter.maxLengthEnforcement} final MaxLengthEnforcement? maxLengthEnforcement; - /// Return an effective [MaxLengthEnforcement] according the target platform. + /// Returns a [MaxLengthEnforcement] that follows the specified [platform]'s + /// convention. /// /// {@template flutter.services.textFormatter.effectiveMaxLengthEnforcement} /// ### Platform specific behaviors @@ -432,11 +433,13 @@ class LengthLimitingTextInputFormatter extends TextInputFormatter { /// [MaxLengthEnforcement.truncateAfterCompositionEnds]. These platforms /// allow the composition to exceed by default. /// {@endtemplate} - static MaxLengthEnforcement get inferredDefaultMaxLengthEnforcement { + static MaxLengthEnforcement getDefaultMaxLengthEnforcement([ + TargetPlatform? platform, + ]) { if (kIsWeb) { return MaxLengthEnforcement.truncateAfterCompositionEnds; } else { - switch (defaultTargetPlatform) { + switch (platform ?? defaultTargetPlatform) { case TargetPlatform.android: case TargetPlatform.windows: return MaxLengthEnforcement.enforced; @@ -493,7 +496,7 @@ class LengthLimitingTextInputFormatter extends TextInputFormatter { assert(maxLength > 0); - switch (maxLengthEnforcement ?? inferredDefaultMaxLengthEnforcement) { + switch (maxLengthEnforcement ?? getDefaultMaxLengthEnforcement()) { case MaxLengthEnforcement.none: return newValue; case MaxLengthEnforcement.enforced: diff --git a/packages/flutter/test/services/text_formatter_test.dart b/packages/flutter/test/services/text_formatter_test.dart index 0458ce9697..b5cb9dd37a 100644 --- a/packages/flutter/test/services/text_formatter_test.dart +++ b/packages/flutter/test/services/text_formatter_test.dart @@ -2,6 +2,7 @@ // 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'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -460,6 +461,28 @@ void main() { expect(formatted.text, 'bbbbbbbbbb'); }); }); + + group('get enforcement from target platform', () { + // The enforcement on Web will be always `MaxLengthEnforcement.truncateAfterCompositionEnds` + + test('with TargetPlatform.windows', () async { + final MaxLengthEnforcement enforcement = LengthLimitingTextInputFormatter.getDefaultMaxLengthEnforcement( + TargetPlatform.windows, + ); + if (kIsWeb) { + expect(enforcement, MaxLengthEnforcement.truncateAfterCompositionEnds); + } else { + expect(enforcement, MaxLengthEnforcement.enforced); + } + }); + + test('with TargetPlatform.macOS', () async { + final MaxLengthEnforcement enforcement = LengthLimitingTextInputFormatter.getDefaultMaxLengthEnforcement( + TargetPlatform.macOS, + ); + expect(enforcement, MaxLengthEnforcement.truncateAfterCompositionEnds); + }); + }); }); test('FilteringTextInputFormatter should return the old value if new value contains non-white-listed character', () {