Alex Li

✅ Add test

  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 }