diff --git a/packages/flutter/lib/src/material/text_form_field.dart b/packages/flutter/lib/src/material/text_form_field.dart index 28c73fb23b..b388d932aa 100644 --- a/packages/flutter/lib/src/material/text_form_field.dart +++ b/packages/flutter/lib/src/material/text_form_field.dart @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:ui' as ui show BoxHeightStyle, BoxWidthStyle; + +import 'package:flutter/gestures.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; @@ -156,6 +159,16 @@ class TextFormField extends FormField { EditableTextContextMenuBuilder? contextMenuBuilder = _defaultContextMenuBuilder, SpellCheckConfiguration? spellCheckConfiguration, TextMagnifierConfiguration? magnifierConfiguration, + UndoHistoryController? undoController, + AppPrivateCommandCallback? onAppPrivateCommand, + bool? cursorOpacityAnimates, + ui.BoxHeightStyle selectionHeightStyle = ui.BoxHeightStyle.tight, + ui.BoxWidthStyle selectionWidthStyle = ui.BoxWidthStyle.tight, + DragStartBehavior dragStartBehavior = DragStartBehavior.start, + ContentInsertionConfiguration? contentInsertionConfiguration, + Clip clipBehavior = Clip.hardEdge, + bool scribbleEnabled = true, + bool canRequestFocus = true, }) : assert(initialValue == null || controller == null), assert(obscuringCharacter.length == 1), assert(maxLines == null || maxLines > 0), @@ -238,6 +251,16 @@ class TextFormField extends FormField { contextMenuBuilder: contextMenuBuilder, spellCheckConfiguration: spellCheckConfiguration, magnifierConfiguration: magnifierConfiguration, + undoController: undoController, + onAppPrivateCommand: onAppPrivateCommand, + cursorOpacityAnimates: cursorOpacityAnimates, + selectionHeightStyle: selectionHeightStyle, + selectionWidthStyle: selectionWidthStyle, + dragStartBehavior: dragStartBehavior, + contentInsertionConfiguration: contentInsertionConfiguration, + clipBehavior: clipBehavior, + scribbleEnabled: scribbleEnabled, + canRequestFocus: canRequestFocus, ), ); }, diff --git a/packages/flutter/test/material/text_form_field_test.dart b/packages/flutter/test/material/text_form_field_test.dart index fe68311de0..afcaedbffd 100644 --- a/packages/flutter/test/material/text_form_field_test.dart +++ b/packages/flutter/test/material/text_form_field_test.dart @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:ui'; + import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; @@ -1196,6 +1198,227 @@ void main() { expect(editableText.magnifierConfiguration, equals(myTextMagnifierConfiguration)); }); + testWidgets('Passes undoController to undoController TextField', (WidgetTester tester) async { + final UndoHistoryController undoController = UndoHistoryController(value: UndoHistoryValue.empty); + + await tester.pumpWidget( + MaterialApp( + home: Material( + child: Center( + child: TextFormField( + undoController: undoController, + ), + ), + ), + ), + ); + + final Finder textFieldFinder = find.byType(TextField); + expect(textFieldFinder, findsOneWidget); + + final TextField textFieldWidget = tester.widget(textFieldFinder); + expect(textFieldWidget.undoController, undoController); + }); + + testWidgets('Passes cursorOpacityAnimates to cursorOpacityAnimates TextField', (WidgetTester tester) async { + const bool cursorOpacityAnimates = true; + + await tester.pumpWidget( + MaterialApp( + home: Material( + child: Center( + child: TextFormField( + cursorOpacityAnimates: cursorOpacityAnimates, + ), + ), + ), + ), + ); + + final Finder textFieldFinder = find.byType(TextField); + expect(textFieldFinder, findsOneWidget); + + final TextField textFieldWidget = tester.widget(textFieldFinder); + expect(textFieldWidget.cursorOpacityAnimates, cursorOpacityAnimates); + }); + + testWidgets('Passes contentInsertionConfiguration to contentInsertionConfiguration TextField', (WidgetTester tester) async { + final ContentInsertionConfiguration contentInsertionConfiguration = + ContentInsertionConfiguration(onContentInserted: (KeyboardInsertedContent value) {}); + + await tester.pumpWidget( + MaterialApp( + home: Material( + child: Center( + child: TextFormField( + contentInsertionConfiguration: contentInsertionConfiguration, + ), + ), + ), + ), + ); + + final Finder textFieldFinder = find.byType(TextField); + expect(textFieldFinder, findsOneWidget); + + final TextField textFieldWidget = tester.widget(textFieldFinder); + expect(textFieldWidget.contentInsertionConfiguration, contentInsertionConfiguration); + }); + + testWidgets('Passes clipBehavior to clipBehavior TextField', (WidgetTester tester) async { + const Clip clipBehavior = Clip.antiAlias; + + await tester.pumpWidget( + MaterialApp( + home: Material( + child: Center( + child: TextFormField( + clipBehavior: clipBehavior, + ), + ), + ), + ), + ); + + final Finder textFieldFinder = find.byType(TextField); + expect(textFieldFinder, findsOneWidget); + + final TextField textFieldWidget = tester.widget(textFieldFinder); + expect(textFieldWidget.clipBehavior, clipBehavior); + }); + + testWidgets('Passes scribbleEnabled to scribbleEnabled TextField', (WidgetTester tester) async { + const bool scribbleEnabled = false; + + await tester.pumpWidget( + MaterialApp( + home: Material( + child: Center( + child: TextFormField( + scribbleEnabled: scribbleEnabled, + ), + ), + ), + ), + ); + + final Finder textFieldFinder = find.byType(TextField); + expect(textFieldFinder, findsOneWidget); + + final TextField textFieldWidget = tester.widget(textFieldFinder); + expect(textFieldWidget.scribbleEnabled, scribbleEnabled); + }); + + testWidgets('Passes canRequestFocus to canRequestFocus TextField', (WidgetTester tester) async { + const bool canRequestFocus = false; + + await tester.pumpWidget( + MaterialApp( + home: Material( + child: Center( + child: TextFormField( + canRequestFocus: canRequestFocus, + ), + ), + ), + ), + ); + + final Finder textFieldFinder = find.byType(TextField); + expect(textFieldFinder, findsOneWidget); + + final TextField textFieldWidget = tester.widget(textFieldFinder); + expect(textFieldWidget.canRequestFocus, canRequestFocus); + }); + + testWidgets('Passes onAppPrivateCommand to onAppPrivateCommand TextField', (WidgetTester tester) async { + void onAppPrivateCommand(String p0, Map p1) {} + + await tester.pumpWidget( + MaterialApp( + home: Material( + child: Center( + child: TextFormField( + onAppPrivateCommand: onAppPrivateCommand, + ), + ), + ), + ), + ); + + final Finder textFieldFinder = find.byType(TextField); + expect(textFieldFinder, findsOneWidget); + + final TextField textFieldWidget = tester.widget(textFieldFinder); + expect(textFieldWidget.onAppPrivateCommand, onAppPrivateCommand); + }); + + testWidgets('Passes selectionHeightStyle to selectionHeightStyle TextField', (WidgetTester tester) async { + const BoxHeightStyle selectionHeightStyle = BoxHeightStyle.max; + + await tester.pumpWidget( + MaterialApp( + home: Material( + child: Center( + child: TextFormField( + selectionHeightStyle: selectionHeightStyle, + ), + ), + ), + ), + ); + + final Finder textFieldFinder = find.byType(TextField); + expect(textFieldFinder, findsOneWidget); + + final TextField textFieldWidget = tester.widget(textFieldFinder); + expect(textFieldWidget.selectionHeightStyle, selectionHeightStyle); + }); + + testWidgets('Passes selectionWidthStyle to selectionWidthStyle TextField', (WidgetTester tester) async { + const BoxWidthStyle selectionWidthStyle = BoxWidthStyle.max; + + await tester.pumpWidget( + MaterialApp( + home: Material( + child: Center( + child: TextFormField( + selectionWidthStyle: selectionWidthStyle, + ), + ), + ), + ), + ); + + final Finder textFieldFinder = find.byType(TextField); + expect(textFieldFinder, findsOneWidget); + + final TextField textFieldWidget = tester.widget(textFieldFinder); + expect(textFieldWidget.selectionWidthStyle, selectionWidthStyle); + }); + + testWidgets('Passes dragStartBehavior to dragStartBehavior TextField', (WidgetTester tester) async { + const DragStartBehavior dragStartBehavior = DragStartBehavior.down; + + await tester.pumpWidget( + MaterialApp( + home: Material( + child: Center( + child: TextFormField( + dragStartBehavior: dragStartBehavior, + ), + ), + ), + ), + ); + + final Finder textFieldFinder = find.byType(TextField); + expect(textFieldFinder, findsOneWidget); + + final TextField textFieldWidget = tester.widget(textFieldFinder); + expect(textFieldWidget.dragStartBehavior, dragStartBehavior); + }); + testWidgets('Error color for cursor while validating', (WidgetTester tester) async { const Color errorColor = Color(0xff123456); await tester.pumpWidget(MaterialApp(