Showing
1 changed file
with
147 additions
and
1 deletions
1 | +import 'package:flutter/cupertino.dart'; | ||
2 | +import 'package:flutter/material.dart'; | ||
1 | import 'package:flutter_test/flutter_test.dart'; | 3 | import 'package:flutter_test/flutter_test.dart'; |
4 | +import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; | ||
2 | 5 | ||
3 | void main() { | 6 | void main() { |
4 | - test('adds one to input values', () {}); | 7 | + group( |
8 | + 'Route.mainState are well-controlled by `mainState`', | ||
9 | + () { | ||
10 | + testWidgets('with showCupertinoModalBottomSheet', (tester) async { | ||
11 | + int _initState = 0, _dispose = 0; | ||
12 | + await _pumpWidget( | ||
13 | + tester: tester, | ||
14 | + onPressed: (context) => showCupertinoModalBottomSheet( | ||
15 | + context: context, | ||
16 | + builder: (_) => _TestWidget( | ||
17 | + onInitState: () => _initState++, | ||
18 | + onDispose: () => _dispose++, | ||
19 | + ), | ||
20 | + ), | ||
21 | + ); | ||
22 | + expect(_initState, 0); | ||
23 | + await tester.tap(_textButtonWithText('Press me')); | ||
24 | + await tester.pumpAndSettle(); | ||
25 | + expect(_initState, 1); | ||
26 | + expect(_dispose, 0); | ||
27 | + await tester.tap(_textButtonWithText('TestWidget push')); | ||
28 | + await tester.pumpAndSettle(); | ||
29 | + expect(_initState, 1); | ||
30 | + expect(_dispose, 0); | ||
31 | + await tester.tap(_textButtonWithText('TestWidget pushed pop')); | ||
32 | + await tester.pumpAndSettle(); | ||
33 | + expect(_initState, 1); | ||
34 | + expect(_dispose, 0); | ||
35 | + await tester.tap(_textButtonWithText('TestWidget pop')); | ||
36 | + await tester.pumpAndSettle(); | ||
37 | + expect(_initState, 1); | ||
38 | + expect(_dispose, 1); | ||
39 | + }); | ||
40 | + }, | ||
41 | + ); | ||
42 | +} | ||
43 | + | ||
44 | +Future<void> _pumpWidget({ | ||
45 | + required WidgetTester tester, | ||
46 | + required void Function(BuildContext context) onPressed, | ||
47 | +}) { | ||
48 | + return tester.pumpWidget( | ||
49 | + MaterialApp( | ||
50 | + home: Builder( | ||
51 | + builder: (context) => Scaffold( | ||
52 | + body: Center( | ||
53 | + child: TextButton( | ||
54 | + onPressed: () => onPressed(context), | ||
55 | + child: Text('Press me'), | ||
56 | + ), | ||
57 | + ), | ||
58 | + ), | ||
59 | + ), | ||
60 | + ), | ||
61 | + ); | ||
62 | +} | ||
63 | + | ||
64 | +Finder _textButtonWithText(String text) { | ||
65 | + return find.widgetWithText(TextButton, text); | ||
66 | +} | ||
67 | + | ||
68 | +class _TestWidget extends StatefulWidget { | ||
69 | + const _TestWidget({ | ||
70 | + Key? key, | ||
71 | + this.onInitState, | ||
72 | + this.onDispose, | ||
73 | + }) : super(key: key); | ||
74 | + | ||
75 | + final VoidCallback? onInitState; | ||
76 | + final VoidCallback? onDispose; | ||
77 | + | ||
78 | + @override | ||
79 | + State<_TestWidget> createState() => _TestWidgetState(); | ||
80 | +} | ||
81 | + | ||
82 | +class _TestWidgetState extends State<_TestWidget> { | ||
83 | + @override | ||
84 | + void initState() { | ||
85 | + super.initState(); | ||
86 | + widget.onInitState?.call(); | ||
87 | + } | ||
88 | + | ||
89 | + @override | ||
90 | + void dispose() { | ||
91 | + widget.onDispose?.call(); | ||
92 | + super.dispose(); | ||
93 | + } | ||
94 | + | ||
95 | + @override | ||
96 | + Widget build(BuildContext context) { | ||
97 | + return Scaffold( | ||
98 | + body: Column( | ||
99 | + mainAxisAlignment: MainAxisAlignment.center, | ||
100 | + children: [ | ||
101 | + TextButton( | ||
102 | + onPressed: () => Navigator.of(context).push( | ||
103 | + defaultPageRoute( | ||
104 | + targetPlatform: Theme.of(context).platform, | ||
105 | + builder: (context) => Scaffold( | ||
106 | + body: Center( | ||
107 | + child: TextButton( | ||
108 | + onPressed: () => Navigator.of(context).pop(), | ||
109 | + child: Text('TestWidget pushed pop'), | ||
110 | + ), | ||
111 | + ), | ||
112 | + ), | ||
113 | + ), | ||
114 | + ), | ||
115 | + child: Text('TestWidget push'), | ||
116 | + ), | ||
117 | + TextButton( | ||
118 | + onPressed: () => Navigator.of(context).pop(), | ||
119 | + child: Text('TestWidget pop'), | ||
120 | + ), | ||
121 | + ], | ||
122 | + ), | ||
123 | + ); | ||
124 | + } | ||
125 | +} | ||
126 | + | ||
127 | +PageRoute<T> defaultPageRoute<T>({ | ||
128 | + required TargetPlatform targetPlatform, | ||
129 | + required WidgetBuilder builder, | ||
130 | + RouteSettings? settings, | ||
131 | + bool maintainState = true, | ||
132 | + bool fullscreenDialog = false, | ||
133 | +}) { | ||
134 | + switch (targetPlatform) { | ||
135 | + case TargetPlatform.iOS: | ||
136 | + case TargetPlatform.macOS: | ||
137 | + return CupertinoPageRoute<T>( | ||
138 | + builder: builder, | ||
139 | + settings: settings, | ||
140 | + maintainState: maintainState, | ||
141 | + fullscreenDialog: fullscreenDialog, | ||
142 | + ); | ||
143 | + default: | ||
144 | + return MaterialPageRoute<T>( | ||
145 | + builder: builder, | ||
146 | + settings: settings, | ||
147 | + maintainState: maintainState, | ||
148 | + fullscreenDialog: fullscreenDialog, | ||
149 | + ); | ||
150 | + } | ||
5 | } | 151 | } |
-
Please register or login to post a comment