diff --git a/packages/flutter/lib/src/material/input_border.dart b/packages/flutter/lib/src/material/input_border.dart index 8fa7ee4c26f..16de08e181e 100644 --- a/packages/flutter/lib/src/material/input_border.dart +++ b/packages/flutter/lib/src/material/input_border.dart @@ -195,6 +195,7 @@ class UnderlineInputBorder extends InputBorder { if (a is UnderlineInputBorder) { return UnderlineInputBorder( borderSide: BorderSide.lerp(a.borderSide, borderSide, t), + borderRadius: BorderRadius.lerp(a.borderRadius, borderRadius, t), ); } return super.lerpFrom(a, t); @@ -205,6 +206,7 @@ class UnderlineInputBorder extends InputBorder { if (b is UnderlineInputBorder) { return UnderlineInputBorder( borderSide: BorderSide.lerp(borderSide, b.borderSide, t), + borderRadius: BorderRadius.lerp(borderRadius, b.borderRadius, t), ); } return super.lerpTo(b, t); diff --git a/packages/flutter/lib/src/material/input_decorator.dart b/packages/flutter/lib/src/material/input_decorator.dart index 66ad01f4e84..a0fbd0bfddb 100644 --- a/packages/flutter/lib/src/material/input_decorator.dart +++ b/packages/flutter/lib/src/material/input_decorator.dart @@ -1898,10 +1898,10 @@ class _InputDecoratorState extends State with TickerProviderStat helperError: helperError, counter: counter, container: container, - ), - textDirection: textDirection, - textBaseline: textBaseline, - isFocused: isFocused, + ), + textDirection: textDirection, + textBaseline: textBaseline, + isFocused: isFocused, ); } } diff --git a/packages/flutter/test/material/input_decorator_test.dart b/packages/flutter/test/material/input_decorator_test.dart index 1c904dd4e47..c116e32d872 100644 --- a/packages/flutter/test/material/input_decorator_test.dart +++ b/packages/flutter/test/material/input_decorator_test.dart @@ -77,6 +77,14 @@ BorderSide getBorderSide(WidgetTester tester) { return getBorder(tester)?.borderSide; } +BorderRadius getBorderRadius(WidgetTester tester) { + final InputBorder border = getBorder(tester); + if (border is UnderlineInputBorder) { + return border.borderRadius; + } + return null; +} + double getBorderWeight(WidgetTester tester) => getBorderSide(tester)?.width; Color getBorderColor(WidgetTester tester) => getBorderSide(tester)?.color; @@ -1931,6 +1939,44 @@ void main() { expect(getBorder(tester), disabledBorder); }); + testWidgets('OutlineInputBorder radius carries over when lerping', (WidgetTester tester) async { + // This is a regression test for https://github.com/flutter/flutter/issues/23982 + const Key key = Key('textField'); + + await tester.pumpWidget( + const MaterialApp( + home: Material( + child: Directionality( + textDirection: TextDirection.ltr, + child: TextField( + key: key, + decoration: InputDecoration( + fillColor: Colors.white, + filled: true, + border: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.blue, width: 2.0), + borderRadius: BorderRadius.zero, + ), + ), + ), + ), + ), + ), + ); + + // TextField has the given border + expect(getBorderRadius(tester), BorderRadius.zero); + + // Focusing does not change the border + await tester.tap(find.byKey(key)); + await tester.pump(); + expect(getBorderRadius(tester), BorderRadius.zero); + await tester.pump(const Duration(milliseconds: 100)); + expect(getBorderRadius(tester), BorderRadius.zero); + await tester.pumpAndSettle(); + expect(getBorderRadius(tester), BorderRadius.zero); + }); + test('InputBorder equality', () { // OutlineInputBorder's equality is defined by the borderRadius, borderSide, & gapPadding const OutlineInputBorder outlineInputBorder = OutlineInputBorder( @@ -1971,5 +2017,4 @@ void main() { expect(underlineInputBorder.hashCode, const UnderlineInputBorder(borderSide: BorderSide(color: Colors.blue)).hashCode); expect(underlineInputBorder.hashCode, isNot(const UnderlineInputBorder().hashCode)); }); - }