| import 'package:flutter/material.dart'; |
| import 'package:test/test.dart'; |
| |
| import 'widget_tester.dart'; |
| |
| class TestOverlayRoute extends OverlayRoute { |
| List<WidgetBuilder> get builders => <WidgetBuilder>[ _build ]; |
| Widget _build(BuildContext context) => new Text('Overlay'); |
| } |
| |
| bool _isOnStage(Element element) { |
| expect(element, isNotNull); |
| bool result = true; |
| element.visitAncestorElements((Element ancestor) { |
| if (ancestor.widget is OffStage) { |
| result = false; |
| return false; |
| } |
| return true; |
| }); |
| return result; |
| } |
| |
| class _IsOnStage extends Matcher { |
| const _IsOnStage(); |
| bool matches(item, Map matchState) => _isOnStage(item); |
| Description describe(Description description) => description.add('onstage'); |
| } |
| |
| class _IsOffStage extends Matcher { |
| const _IsOffStage(); |
| bool matches(item, Map matchState) => !_isOnStage(item); |
| Description describe(Description description) => description.add('offstage'); |
| } |
| |
| const Matcher isOnStage = const _IsOnStage(); |
| const Matcher isOffStage = const _IsOffStage(); |
| |
| void main() { |
| test('Can pop ephemeral route without black flash', () { |
| testWidgets((WidgetTester tester) { |
| GlobalKey containerKey = new GlobalKey(); |
| final Map<String, RouteBuilder> routes = <String, RouteBuilder>{ |
| '/': (_) => new Container(key: containerKey, child: new Text('Home')), |
| '/settings': (_) => new Container(child: new Text('Settings')), |
| }; |
| |
| tester.pumpWidget(new MaterialApp(routes: routes)); |
| |
| expect(tester.findText('Home'), isOnStage); |
| expect(tester.findText('Settings'), isNull); |
| expect(tester.findText('Overlay'), isNull); |
| |
| NavigatorState navigator = Navigator.of(containerKey.currentContext); |
| |
| navigator.pushNamed('/settings'); |
| |
| tester.pump(); |
| |
| expect(tester.findText('Home'), isOnStage); |
| expect(tester.findText('Settings'), isOffStage); |
| expect(tester.findText('Overlay'), isNull); |
| |
| tester.pump(const Duration(milliseconds: 16)); |
| |
| expect(tester.findText('Home'), isOnStage); |
| expect(tester.findText('Settings'), isOnStage); |
| expect(tester.findText('Overlay'), isNull); |
| |
| tester.pump(const Duration(seconds: 1)); |
| |
| expect(tester.findText('Home'), isNull); |
| expect(tester.findText('Settings'), isOnStage); |
| expect(tester.findText('Overlay'), isNull); |
| |
| navigator.push(new TestOverlayRoute()); |
| |
| tester.pump(); |
| |
| expect(tester.findText('Home'), isNull); |
| expect(tester.findText('Settings'), isOnStage); |
| expect(tester.findText('Overlay'), isOnStage); |
| |
| tester.pump(const Duration(seconds: 1)); |
| |
| expect(tester.findText('Home'), isNull); |
| expect(tester.findText('Settings'), isOnStage); |
| expect(tester.findText('Overlay'), isOnStage); |
| |
| navigator.pop(); |
| tester.pump(); |
| |
| expect(tester.findText('Home'), isNull); |
| expect(tester.findText('Settings'), isOnStage); |
| expect(tester.findText('Overlay'), isNull); |
| |
| tester.pump(const Duration(seconds: 1)); |
| |
| expect(tester.findText('Home'), isNull); |
| expect(tester.findText('Settings'), isOnStage); |
| expect(tester.findText('Overlay'), isNull); |
| |
| navigator.pop(); |
| tester.pump(); |
| |
| expect(tester.findText('Home'), isOnStage); |
| expect(tester.findText('Settings'), isOnStage); |
| expect(tester.findText('Overlay'), isNull); |
| |
| tester.pump(const Duration(seconds: 1)); |
| |
| expect(tester.findText('Home'), isOnStage); |
| expect(tester.findText('Settings'), isNull); |
| expect(tester.findText('Overlay'), isNull); |
| |
| }); |
| }); |
| } |