diff --git a/.ci.yaml b/.ci.yaml
index 7983bed..ef7967e 100755
--- a/.ci.yaml
+++ b/.ci.yaml
@@ -10,6 +10,7 @@
   - dev
   - beta
   - stable
+  - flutter-2.6-candidate.5
 
 platform_properties:
   linux:
diff --git a/AUTHORS b/AUTHORS
index ef495b3..71d7f10 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -83,4 +83,3 @@
 Karol Czeryna <karol.czeryna@gmail.com>
 Callum Moffat <callum@moffatman.com>
 Koutaro Mori <koutaro.mo@gmail.com>
-Sergei Smitskoi <sergflutterdev@gmail.com>
diff --git a/packages/flutter/lib/src/material/input_decorator.dart b/packages/flutter/lib/src/material/input_decorator.dart
index 333fed6..67a5749 100644
--- a/packages/flutter/lib/src/material/input_decorator.dart
+++ b/packages/flutter/lib/src/material/input_decorator.dart
@@ -971,17 +971,11 @@
     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 @@
       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 @@
 
   @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, <RenderBox?>[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, <RenderBox?>[input, hint]);
-    final double inputMaxHeight = <double>[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, <RenderBox?>[prefix, input, suffix])
       + contentPadding.bottom
       + densityOffset.dy;
-    final double containerHeight = <double>[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 080eb5c..ee74400 100644
--- a/packages/flutter/test/material/input_decorator_test.dart
+++ b/packages/flutter/test/material/input_decorator_test.dart
@@ -5023,146 +5023,6 @@
     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: <Widget>[
-                  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: <Widget>[
-                  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: <Widget>[
-                  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: <Widget>[
-                  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: <Widget>[
-                  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));
