From 71a4c6f8e8c2ff1d199a2ca6efa2603f6785e74a Mon Sep 17 00:00:00 2001 From: Zachary Anderson Date: Wed, 8 Sep 2021 11:26:02 -0700 Subject: [PATCH] Revert "Fix computeMinIntrinsicHeight in _RenderDecoration (#87404)" (#89667) This reverts commit 5cf62e84451c23a8aa8c65d56b001913453f39d7. --- AUTHORS | 1 - .../lib/src/material/input_decorator.dart | 60 ++------ .../test/material/input_decorator_test.dart | 140 ------------------ 3 files changed, 14 insertions(+), 187 deletions(-) diff --git a/AUTHORS b/AUTHORS index ef495b3bb3..71d7f107b1 100644 --- a/AUTHORS +++ b/AUTHORS @@ -83,4 +83,3 @@ Mirko Mucaria Karol Czeryna Callum Moffat Koutaro Mori -Sergei Smitskoi diff --git a/packages/flutter/lib/src/material/input_decorator.dart b/packages/flutter/lib/src/material/input_decorator.dart index 333fed6660..67a5749093 100644 --- a/packages/flutter/lib/src/material/input_decorator.dart +++ b/packages/flutter/lib/src/material/input_decorator.dart @@ -971,17 +971,11 @@ class _RenderDecoration extends RenderBox { final BoxConstraints boxConstraints = layoutConstraints.loosen(); // Layout all the widgets used by InputDecorator + boxToBaseline[prefix] = _layoutLineBox(prefix, boxConstraints); + boxToBaseline[suffix] = _layoutLineBox(suffix, boxConstraints); boxToBaseline[icon] = _layoutLineBox(icon, boxConstraints); - final BoxConstraints containerConstraints = boxConstraints.copyWith( - maxWidth: boxConstraints.maxWidth - _boxSize(icon).width, - ); - boxToBaseline[prefixIcon] = _layoutLineBox(prefixIcon, containerConstraints); - boxToBaseline[suffixIcon] = _layoutLineBox(suffixIcon, containerConstraints); - final BoxConstraints contentConstraints = containerConstraints.copyWith( - maxWidth: containerConstraints.maxWidth - contentPadding.horizontal, - ); - boxToBaseline[prefix] = _layoutLineBox(prefix, contentConstraints); - boxToBaseline[suffix] = _layoutLineBox(suffix, contentConstraints); + boxToBaseline[prefixIcon] = _layoutLineBox(prefixIcon, boxConstraints); + boxToBaseline[suffixIcon] = _layoutLineBox(suffixIcon, boxConstraints); final double inputWidth = math.max( 0.0, @@ -1017,14 +1011,18 @@ class _RenderDecoration extends RenderBox { hint, boxConstraints.copyWith(minWidth: inputWidth, maxWidth: inputWidth), ); - boxToBaseline[counter] = _layoutLineBox(counter, contentConstraints); + boxToBaseline[counter] = _layoutLineBox(counter, boxConstraints); // The helper or error text can occupy the full width less the space // occupied by the icon and counter. boxToBaseline[helperError] = _layoutLineBox( helperError, - contentConstraints.copyWith( - maxWidth: math.max(0.0, contentConstraints.maxWidth - _boxSize(counter).width), + boxConstraints.copyWith( + maxWidth: math.max(0.0, boxConstraints.maxWidth + - _boxSize(icon).width + - _boxSize(counter).width + - contentPadding.horizontal, + ), ), ); @@ -1269,45 +1267,15 @@ class _RenderDecoration extends RenderBox { @override double computeMinIntrinsicHeight(double width) { - final double iconHeight = _minHeight(icon, width); - final double iconWidth = _minWidth(icon, iconHeight); - - width = math.max(width - iconWidth, 0.0); - - final double prefixIconHeight = _minHeight(prefixIcon, width); - final double prefixIconWidth = _minWidth(prefixIcon, prefixIconHeight); - - final double suffixIconHeight = _minHeight(suffixIcon, width); - final double suffixIconWidth = _minWidth(suffixIcon, suffixIconHeight); - - width = math.max(width - contentPadding.horizontal, 0.0); - - final double counterHeight = _minHeight(counter, width); - final double counterWidth = _minWidth(counter, counterHeight); - - final double helperErrorAvailableWidth = math.max(width - counterWidth, 0.0); - final double helperErrorHeight = _minHeight(helperError, helperErrorAvailableWidth); - double subtextHeight = math.max(counterHeight, helperErrorHeight); + double subtextHeight = _lineHeight(width, [helperError, counter]); if (subtextHeight > 0.0) subtextHeight += subtextGap; - - final double prefixHeight = _minHeight(prefix, width); - final double prefixWidth = _minWidth(prefix, prefixHeight); - - final double suffixHeight = _minHeight(suffix, width); - final double suffixWidth = _minWidth(suffix, suffixHeight); - - final double availableInputWidth = math.max(width - prefixWidth - suffixWidth - prefixIconWidth - suffixIconWidth, 0.0); - final double inputHeight = _lineHeight(availableInputWidth, [input, hint]); - final double inputMaxHeight = [inputHeight, prefixHeight, suffixHeight].reduce(math.max); - final Offset densityOffset = decoration.visualDensity!.baseSizeAdjustment; - final double contentHeight = contentPadding.top + final double containerHeight = contentPadding.top + (label == null ? 0.0 : decoration.floatingLabelHeight) - + inputMaxHeight + + _lineHeight(width, [prefix, input, suffix]) + contentPadding.bottom + densityOffset.dy; - final double containerHeight = [iconHeight, contentHeight, prefixIconHeight, suffixIconHeight].reduce(math.max); final double minContainerHeight = decoration.isDense! || expands ? 0.0 : kMinInteractiveDimension; diff --git a/packages/flutter/test/material/input_decorator_test.dart b/packages/flutter/test/material/input_decorator_test.dart index 080eb5c6f0..ee74400108 100644 --- a/packages/flutter/test/material/input_decorator_test.dart +++ b/packages/flutter/test/material/input_decorator_test.dart @@ -5023,146 +5023,6 @@ void main() { expect(tester.takeException(), isNull); }); - testWidgets('min intrinsic height for TextField with prefix icon', (WidgetTester tester) async { - // Regression test for: https://github.com/flutter/flutter/issues/87403 - await tester.pumpWidget(MaterialApp( - home: Material( - child: Center( - child: SizedBox( - width: 100.0, - child: IntrinsicHeight( - child: Column( - children: [ - TextField( - controller: TextEditingController(text: 'input'), - maxLines: null, - decoration: const InputDecoration( - prefixIcon: Icon(Icons.search), - ), - ), - ], - ), - ), - ), - ), - ), - )); - - expect(tester.takeException(), isNull); - }); - - testWidgets('min intrinsic height for TextField with suffix icon', (WidgetTester tester) async { - // Regression test for: https://github.com/flutter/flutter/issues/87403 - await tester.pumpWidget(MaterialApp( - home: Material( - child: Center( - child: SizedBox( - width: 100.0, - child: IntrinsicHeight( - child: Column( - children: [ - TextField( - controller: TextEditingController(text: 'input'), - maxLines: null, - decoration: const InputDecoration( - suffixIcon: Icon(Icons.search), - ), - ), - ], - ), - ), - ), - ), - ), - )); - - expect(tester.takeException(), isNull); - }); - - testWidgets('min intrinsic height for TextField with prefix', (WidgetTester tester) async { - // Regression test for: https://github.com/flutter/flutter/issues/87403 - await tester.pumpWidget(MaterialApp( - home: Material( - child: Center( - child: SizedBox( - width: 100.0, - child: IntrinsicHeight( - child: Column( - children: [ - TextField( - controller: TextEditingController(text: 'input'), - maxLines: null, - decoration: const InputDecoration( - prefix: Text('prefix'), - ), - ), - ], - ), - ), - ), - ), - ), - )); - - expect(tester.takeException(), isNull); - }); - - testWidgets('min intrinsic height for TextField with suffix', (WidgetTester tester) async { - // Regression test for: https://github.com/flutter/flutter/issues/87403 - await tester.pumpWidget(MaterialApp( - home: Material( - child: Center( - child: SizedBox( - width: 100.0, - child: IntrinsicHeight( - child: Column( - children: [ - TextField( - controller: TextEditingController(text: 'input'), - maxLines: null, - decoration: const InputDecoration( - suffix: Text('suffix'), - ), - ), - ], - ), - ), - ), - ), - ), - )); - - expect(tester.takeException(), isNull); - }); - - testWidgets('min intrinsic height for TextField with icon', (WidgetTester tester) async { - // Regression test for: https://github.com/flutter/flutter/issues/87403 - await tester.pumpWidget(MaterialApp( - home: Material( - child: Center( - child: SizedBox( - width: 100.0, - child: IntrinsicHeight( - child: Column( - children: [ - TextField( - controller: TextEditingController(text: 'input'), - maxLines: null, - decoration: const InputDecoration( - icon: Icon(Icons.search), - ), - ), - ], - ), - ), - ), - ), - ), - )); - - expect(tester.takeException(), isNull); - }); - testWidgets('InputDecorationTheme floatingLabelStyle overrides label widget styles when the widget is a text widget (focused)', (WidgetTester tester) async { const TextStyle style16 = TextStyle(fontFamily: 'Ahem', fontSize: 16.0); final TextStyle floatingLabelStyle = style16.merge(const TextStyle(color: Colors.indigo));