From 118bf365800a7e6ede55f3168a563483dbdc4877 Mon Sep 17 00:00:00 2001 From: Valentin Vignal <32538273+ValentinVignal@users.noreply.github.com> Date: Fri, 17 May 2024 05:37:19 +0800 Subject: [PATCH] [go_router_builder] Add test for `onExit` (#6614) Follows https://github.com/flutter/packages/pull/6495 Fixes https://github.com/flutter/flutter/issues/137394 --- packages/go_router_builder/CHANGELOG.md | 5 +- .../example/lib/on_exit_example.dart | 96 +++++++++++++++++++ .../example/lib/on_exit_example.g.dart | 58 +++++++++++ .../go_router_builder/example/pubspec.yaml | 2 +- .../example/test/on_exit_example_test.dart | 46 +++++++++ packages/go_router_builder/pubspec.yaml | 4 +- 6 files changed, 206 insertions(+), 5 deletions(-) create mode 100644 packages/go_router_builder/example/lib/on_exit_example.dart create mode 100644 packages/go_router_builder/example/lib/on_exit_example.g.dart create mode 100644 packages/go_router_builder/example/test/on_exit_example_test.dart diff --git a/packages/go_router_builder/CHANGELOG.md b/packages/go_router_builder/CHANGELOG.md index da8e5e6fbfbe..3332a70e1b8d 100644 --- a/packages/go_router_builder/CHANGELOG.md +++ b/packages/go_router_builder/CHANGELOG.md @@ -1,6 +1,7 @@ -## NEXT +## 2.7.0 -* Updates minimum supported SDK version to Flutter 3.16/Dart 3.2. +- Adds an example and a test with `onExit`. +- Updates minimum supported SDK version to Flutter 3.16/Dart 3.2. ## 2.6.2 diff --git a/packages/go_router_builder/example/lib/on_exit_example.dart b/packages/go_router_builder/example/lib/on_exit_example.dart new file mode 100644 index 000000000000..b574c852c6e4 --- /dev/null +++ b/packages/go_router_builder/example/lib/on_exit_example.dart @@ -0,0 +1,96 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// ignore_for_file: public_member_api_docs, unreachable_from_main + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +part 'on_exit_example.g.dart'; + +void main() => runApp(App()); + +class App extends StatelessWidget { + App({super.key}); + + @override + Widget build(BuildContext context) => MaterialApp.router( + routerConfig: _router, + title: _appTitle, + ); + + final GoRouter _router = GoRouter(routes: $appRoutes); +} + +@TypedGoRoute( + path: '/', + routes: >[ + TypedGoRoute(path: 'sub-route') + ], +) +class HomeRoute extends GoRouteData { + const HomeRoute(); + + @override + Widget build(BuildContext context, GoRouterState state) => const HomeScreen(); +} + +class SubRoute extends GoRouteData { + const SubRoute(); + + @override + Future onExit(BuildContext context, GoRouterState state) async { + final bool? confirmed = await showDialog( + context: context, + builder: (_) => AlertDialog( + content: const Text('Are you sure to leave this page?'), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(false), + child: const Text('Cancel'), + ), + ElevatedButton( + onPressed: () => Navigator.of(context).pop(true), + child: const Text('Confirm'), + ), + ], + ), + ); + return confirmed ?? false; + } + + @override + Widget build(BuildContext context, GoRouterState state) => const SubScreen(); +} + +class HomeScreen extends StatelessWidget { + const HomeScreen({super.key}); + + @override + Widget build(BuildContext context) => Scaffold( + appBar: AppBar(title: const Text(_appTitle)), + body: Center( + child: ElevatedButton( + onPressed: () => const SubRoute().go(context), + child: const Text('Go to sub screen'), + ), + )); +} + +class SubScreen extends StatelessWidget { + const SubScreen({super.key}); + + @override + Widget build(BuildContext context) => Scaffold( + appBar: AppBar(title: const Text('$_appTitle Sub screen')), + body: Center( + child: ElevatedButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text('Go back'), + ), + ), + ); +} + +const String _appTitle = 'GoRouter Example: builder'; diff --git a/packages/go_router_builder/example/lib/on_exit_example.g.dart b/packages/go_router_builder/example/lib/on_exit_example.g.dart new file mode 100644 index 000000000000..8a99156d8bfe --- /dev/null +++ b/packages/go_router_builder/example/lib/on_exit_example.g.dart @@ -0,0 +1,58 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +// ignore_for_file: always_specify_types, public_member_api_docs + +part of 'on_exit_example.dart'; + +// ************************************************************************** +// GoRouterGenerator +// ************************************************************************** + +List get $appRoutes => [ + $homeRoute, + ]; + +RouteBase get $homeRoute => GoRouteData.$route( + path: '/', + factory: $HomeRouteExtension._fromState, + routes: [ + GoRouteData.$route( + path: 'sub-route', + factory: $SubRouteExtension._fromState, + ), + ], + ); + +extension $HomeRouteExtension on HomeRoute { + static HomeRoute _fromState(GoRouterState state) => const HomeRoute(); + + String get location => GoRouteData.$location( + '/', + ); + + void go(BuildContext context) => context.go(location); + + Future push(BuildContext context) => context.push(location); + + void pushReplacement(BuildContext context) => + context.pushReplacement(location); + + void replace(BuildContext context) => context.replace(location); +} + +extension $SubRouteExtension on SubRoute { + static SubRoute _fromState(GoRouterState state) => const SubRoute(); + + String get location => GoRouteData.$location( + '/sub-route', + ); + + void go(BuildContext context) => context.go(location); + + Future push(BuildContext context) => context.push(location); + + void pushReplacement(BuildContext context) => + context.pushReplacement(location); + + void replace(BuildContext context) => context.replace(location); +} diff --git a/packages/go_router_builder/example/pubspec.yaml b/packages/go_router_builder/example/pubspec.yaml index f232d606cab6..bc02b13402eb 100644 --- a/packages/go_router_builder/example/pubspec.yaml +++ b/packages/go_router_builder/example/pubspec.yaml @@ -9,7 +9,7 @@ dependencies: collection: ^1.15.0 flutter: sdk: flutter - go_router: ^10.0.0 + go_router: ^14.1.1 provider: 6.0.5 dev_dependencies: diff --git a/packages/go_router_builder/example/test/on_exit_example_test.dart b/packages/go_router_builder/example/test/on_exit_example_test.dart new file mode 100644 index 000000000000..e41adb0c6181 --- /dev/null +++ b/packages/go_router_builder/example/test/on_exit_example_test.dart @@ -0,0 +1,46 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:go_router_builder_example/on_exit_example.dart'; + +void main() { + testWidgets('It should trigger the on exit when leaving the route', + (WidgetTester tester) async { + await tester.pumpWidget(App()); + expect(find.byType(HomeScreen), findsOne); + + await tester.tap(find.widgetWithText(ElevatedButton, 'Go to sub screen')); + await tester.pumpAndSettle(); + + expect(find.byType(SubScreen), findsOne); + + await tester.tap(find.widgetWithText(ElevatedButton, 'Go back')); + await tester.pumpAndSettle(); + + expect( + find.widgetWithText(AlertDialog, 'Are you sure to leave this page?'), + findsOne, + ); + await tester.tap(find.text('Cancel')); + await tester.pumpAndSettle(); + + expect(find.byType(HomeScreen), findsNothing); + expect(find.byType(SubScreen), findsOne); + + await tester.tap(find.widgetWithText(ElevatedButton, 'Go back')); + await tester.pumpAndSettle(); + + expect( + find.widgetWithText(AlertDialog, 'Are you sure to leave this page?'), + findsOne, + ); + await tester.tap(find.text('Confirm')); + await tester.pumpAndSettle(); + + expect(find.byType(HomeScreen), findsOne); + expect(find.byType(SubScreen), findsNothing); + }); +} diff --git a/packages/go_router_builder/pubspec.yaml b/packages/go_router_builder/pubspec.yaml index 65ca0b982d51..0e6e10b6b3d6 100644 --- a/packages/go_router_builder/pubspec.yaml +++ b/packages/go_router_builder/pubspec.yaml @@ -2,7 +2,7 @@ name: go_router_builder description: >- A builder that supports generated strongly-typed route helpers for package:go_router -version: 2.6.2 +version: 2.7.0 repository: https://github.com/flutter/packages/tree/main/packages/go_router_builder issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+go_router_builder%22 @@ -26,7 +26,7 @@ dev_dependencies: dart_style: 2.3.6 flutter: sdk: flutter - go_router: ^10.0.0 + go_router: ^14.0.0 test: ^1.20.0 topics: