From 14aa57b18da642f86e604752bd43c8f37cb72046 Mon Sep 17 00:00:00 2001 From: Hans Muller Date: Mon, 1 Apr 2019 09:28:18 -0700 Subject: [PATCH] Fix OutlineInputBorder crash (#30123) --- .../lib/src/material/input_border.dart | 6 ++-- .../test/material/input_decorator_test.dart | 36 +++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/packages/flutter/lib/src/material/input_border.dart b/packages/flutter/lib/src/material/input_border.dart index fbfa167f507..fa1866c2844 100644 --- a/packages/flutter/lib/src/material/input_border.dart +++ b/packages/flutter/lib/src/material/input_border.dart @@ -412,7 +412,7 @@ class OutlineInputBorder extends InputBorder { const double cornerArcSweep = math.pi / 2.0; final double tlCornerArcSweep = start < center.tlRadiusX - ? math.asin(start / center.tlRadiusX) + ? math.asin((start / center.tlRadiusX).clamp(-1.0, 1.0)) : math.pi / 2.0; final Path path = Path() @@ -474,12 +474,12 @@ class OutlineInputBorder extends InputBorder { final double extent = lerpDouble(0.0, gapExtent + gapPadding * 2.0, gapPercentage); switch (textDirection) { case TextDirection.rtl: { - final Path path = _gapBorderPath(canvas, center, gapStart + gapPadding - extent, extent); + final Path path = _gapBorderPath(canvas, center, math.max(0.0, gapStart + gapPadding - extent), extent); canvas.drawPath(path, paint); break; } case TextDirection.ltr: { - final Path path = _gapBorderPath(canvas, center, gapStart - gapPadding, extent); + final Path path = _gapBorderPath(canvas, center, math.max(0.0, gapStart - gapPadding), extent); canvas.drawPath(path, paint); break; } diff --git a/packages/flutter/test/material/input_decorator_test.dart b/packages/flutter/test/material/input_decorator_test.dart index 8e8cba89405..6697d224832 100644 --- a/packages/flutter/test/material/input_decorator_test.dart +++ b/packages/flutter/test/material/input_decorator_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 'dart:async'; import 'dart:io' show Platform; import 'package:flutter/material.dart'; @@ -2255,6 +2256,41 @@ void main() { expect(getBorderRadius(tester), BorderRadius.zero); }); + testWidgets('OutlineInputBorder async lerp', (WidgetTester tester) async { + // Regression test for https://github.com/flutter/flutter/issues/28724 + + final Completer completer = Completer(); + bool waitIsOver = false; + + await tester.pumpWidget( + MaterialApp( + home: StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + return GestureDetector( + onTap: () async { + setState(() { waitIsOver = true; }); + await completer.future; + setState(() { waitIsOver = false; }); + }, + child: InputDecorator( + decoration: InputDecoration( + labelText: 'Test', + enabledBorder: !waitIsOver ? null : const OutlineInputBorder(borderSide: BorderSide(color: Colors.blue)), + ), + ), + ); + }, + ), + ), + ); + + await tester.tap(find.byType(StatefulBuilder)); + await tester.pumpAndSettle(); + + completer.complete(); + await tester.pumpAndSettle(); + }); + test('InputBorder equality', () { // OutlineInputBorder's equality is defined by the borderRadius, borderSide, & gapPadding const OutlineInputBorder outlineInputBorder = OutlineInputBorder(