From e118e1a623272f018b93a8c325f14d28faf77d23 Mon Sep 17 00:00:00 2001 From: Andrey Kabylin Date: Wed, 25 Nov 2020 17:28:03 +0000 Subject: [PATCH] fix #24469 and #67354 (#69668) --- AUTHORS | 1 + packages/flutter/lib/src/widgets/routes.dart | 6 +- .../flutter/test/widgets/routes_test.dart | 66 ++++++++++++++++++- 3 files changed, 68 insertions(+), 5 deletions(-) diff --git a/AUTHORS b/AUTHORS index 04d14ccf3d9..261e98b9eaa 100644 --- a/AUTHORS +++ b/AUTHORS @@ -70,3 +70,4 @@ YeungKC Nobuhiro Tabuki nt4f04uNd Anurag Roy +Andrey Kabylin diff --git a/packages/flutter/lib/src/widgets/routes.dart b/packages/flutter/lib/src/widgets/routes.dart index 197fd3d9be6..3adc8cf0f1f 100644 --- a/packages/flutter/lib/src/widgets/routes.dart +++ b/packages/flutter/lib/src/widgets/routes.dart @@ -27,8 +27,6 @@ import 'transitions.dart'; // dynamic routeObserver; // NavigatorState navigator; -const Color _kTransparent = Color(0x00000000); - /// A route that displays widgets in the [Navigator]'s [Overlay]. abstract class OverlayRoute extends Route { /// Creates a route that knows how to interact with an [Overlay]. @@ -1475,10 +1473,10 @@ abstract class ModalRoute extends TransitionRoute with LocalHistoryRoute color = animation!.drive( ColorTween( - begin: _kTransparent, + begin: barrierColor!.withOpacity(0.0), end: barrierColor, // changedInternalState is called if barrierColor updates ).chain(CurveTween(curve: barrierCurve)), // changedInternalState is called if barrierCurve updates ); diff --git a/packages/flutter/test/widgets/routes_test.dart b/packages/flutter/test/widgets/routes_test.dart index e279969e24a..3c63c730e62 100644 --- a/packages/flutter/test/widgets/routes_test.dart +++ b/packages/flutter/test/widgets/routes_test.dart @@ -1425,6 +1425,69 @@ void main() { expect(modalBarrierAnimation.value, Colors.black); }); + testWidgets('white barrierColor', (WidgetTester tester) async { + await tester.pumpWidget(MaterialApp( + home: Material( + child: Builder( + builder: (BuildContext context) { + return Center( + child: ElevatedButton( + child: const Text('X'), + onPressed: () { + Navigator.of(context).push( + _TestDialogRouteWithCustomBarrierCurve( + child: const Text('Hello World'), + barrierColor: Colors.white, + ) + ); + }, + ), + ); + } + ), + ), + )); + + final CurveTween _defaultBarrierTween = CurveTween(curve: Curves.ease); + int _getExpectedBarrierTweenAlphaValue(double t) { + return Color.getAlphaFromOpacity(_defaultBarrierTween.transform(t)); + } + + await tester.tap(find.text('X')); + await tester.pump(); + final Finder animatedModalBarrier = find.byType(AnimatedModalBarrier); + expect(animatedModalBarrier, findsOneWidget); + + Animation modalBarrierAnimation; + modalBarrierAnimation = tester.widget(animatedModalBarrier).color; + expect(modalBarrierAnimation.value, Colors.white.withOpacity(0)); + + await tester.pump(const Duration(milliseconds: 25)); + modalBarrierAnimation = tester.widget(animatedModalBarrier).color; + expect( + modalBarrierAnimation.value!.alpha, + closeTo(_getExpectedBarrierTweenAlphaValue(0.25), 1), + ); + + await tester.pump(const Duration(milliseconds: 25)); + modalBarrierAnimation = tester.widget(animatedModalBarrier).color; + expect( + modalBarrierAnimation.value!.alpha, + closeTo(_getExpectedBarrierTweenAlphaValue(0.50), 1), + ); + + await tester.pump(const Duration(milliseconds: 25)); + modalBarrierAnimation = tester.widget(animatedModalBarrier).color; + expect( + modalBarrierAnimation.value!.alpha, + closeTo(_getExpectedBarrierTweenAlphaValue(0.75), 1), + ); + + await tester.pumpAndSettle(); + modalBarrierAnimation = tester.widget(animatedModalBarrier).color; + expect(modalBarrierAnimation.value, Colors.white); + }); + testWidgets('modal route semantics order', (WidgetTester tester) async { // Regression test for https://github.com/flutter/flutter/issues/46625. final SemanticsTester semantics = SemanticsTester(tester); @@ -1781,6 +1844,7 @@ class _TestDialogRouteWithCustomBarrierCurve extends PopupRoute { _TestDialogRouteWithCustomBarrierCurve({ required Widget child, this.barrierLabel, + this.barrierColor = Colors.black, Curve? barrierCurve, }) : _barrierCurve = barrierCurve, _child = child; @@ -1794,7 +1858,7 @@ class _TestDialogRouteWithCustomBarrierCurve extends PopupRoute { final String? barrierLabel; @override - Color get barrierColor => Colors.black; // easier value to test against + final Color? barrierColor; @override Curve get barrierCurve {