Skip to content

Commit

Permalink
Add GetNavigatorObserverUsecase.
Browse files Browse the repository at this point in the history
  • Loading branch information
nero-angela committed Aug 22, 2024
1 parent d8ce864 commit 2a60840
Show file tree
Hide file tree
Showing 18 changed files with 386 additions and 282 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ migrate_working_dir/
# VS Code
.vscode/*
!launch.json
!snippets.code-snippets

# Flutter/Dart/Pub related
**/doc/api/
Expand Down
7 changes: 4 additions & 3 deletions lib/app/app.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:x_pr/app/routes/routes.dart';
import 'package:x_pr/app/routes/routes_setting.dart';
import 'package:x_pr/core/localization/generated/l10n.dart';
import 'package:x_pr/core/theme/components/toast/toast.dart';
import 'package:x_pr/core/theme/foundations/app_theme.dart';
Expand Down Expand Up @@ -50,8 +50,9 @@ class _AppState extends ConsumerState<App> {
}

final config = ref.watch(ConfigService.$);
final routesSetting = ref.read(RoutesSetting.$);
return InheritedAppTheme(
navigatorKey: Routes.navigatorKey,
navigatorKey: routesSetting.navigatorKey,
isLightTheme: config.isLightTheme,
builder: (context) => MaterialApp.router(
localizationsDelegates: const [
Expand All @@ -64,7 +65,7 @@ class _AppState extends ConsumerState<App> {
debugShowCheckedModeBanner: false,
locale: config.language.locale,
theme: context.themeData,
routerConfig: Routes.config,
routerConfig: routesSetting.router,
builder: (context, child) => Stack(
fit: StackFit.expand,
children: [
Expand Down
6 changes: 3 additions & 3 deletions lib/app/pages/game/widgets/game_exit_confirm_dialog.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ class GameExitConfirmDialog extends StatelessWidget {
const GameExitConfirmDialog({super.key});

@override
Widget build(BuildContext dialogContext) {
Widget build(BuildContext context) {
return ConfirmDialog(
title: S.current.gamePagePopTitle,
content: TextBalancer(
Expand All @@ -18,8 +18,8 @@ class GameExitConfirmDialog extends StatelessWidget {
),
confirmText: S.current.leave,
onConfirm: () {
if (dialogContext.mounted) dialogContext.pop();
Routes.context.pop();
if (context.mounted) context.pop();
context.popUntil(Routes.homePage);
},
);
}
Expand Down
6 changes: 4 additions & 2 deletions lib/app/pages/home/home_page_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:x_pr/app/pages/home/home_page_state.dart';
import 'package:x_pr/app/routes/routes.dart';
import 'package:x_pr/app/routes/routes_setting.dart';
import 'package:x_pr/core/utils/log/logger.dart';
import 'package:x_pr/core/utils/time/network_time_ext.dart';
import 'package:x_pr/core/view/base_view_model.dart';
Expand All @@ -20,6 +21,7 @@ abstract class HomePageModel extends BaseViewModel<HomePageState> {
HomePageModel(super.buildState);

Config get config => ref.read(ConfigService.$);
BuildContext get globalContext => ref.read(RoutesSetting.$).context;
ConfigService get configService => ref.read(ConfigService.$.notifier);
AuthServiceState get authServiceState => ref.read(AuthService.$);
late GameService gameService = ref.read(GameService.$.notifier);
Expand Down Expand Up @@ -47,8 +49,8 @@ abstract class HomePageModel extends BaseViewModel<HomePageState> {
Logger.d('🔗 AppLink : $uri');
final roomId = uri.queryParameters["room"];
if (roomId != null && roomId.isNotEmpty) {
if (await enter(roomId) && Routes.context.mounted) {
Routes.context.pushNamed(Routes.gamePage.name);
if (await enter(roomId) && globalContext.mounted) {
globalContext.pushNamed(Routes.gamePage.name);
}
}
});
Expand Down
192 changes: 0 additions & 192 deletions lib/app/routes/routes.dart
Original file line number Diff line number Diff line change
@@ -1,33 +1,5 @@
// ignore_for_file: library_prefixes
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:x_pr/app/pages/dev/component/component_page.dart';
import 'package:x_pr/app/pages/dev/dev_page.dart';
import 'package:x_pr/app/pages/dev/local_data/local_data_page.dart';
import 'package:x_pr/app/pages/dev/log/log_page.dart';
import 'package:x_pr/app/pages/game/game_page.dart';
import 'package:x_pr/app/pages/game/widgets/game_exit_confirm_dialog.dart';
import 'package:x_pr/app/pages/home/dialogs/notice_dialog.dart';
import 'package:x_pr/app/pages/home/home_page.dart';
import 'package:x_pr/app/pages/join/join_page.dart';
import 'package:x_pr/app/pages/login/bottom_sheets/login_bottom_sheet.dart';
import 'package:x_pr/app/pages/login/dialogs/logout_dialog.dart';
import 'package:x_pr/app/pages/nickname/nickname_page.dart';
import 'package:x_pr/app/pages/setting/app_license/app_license_page.dart';
import 'package:x_pr/app/pages/setting/edit_nickname/edit_nickname_page.dart';
import 'package:x_pr/app/pages/setting/language/language_bottom_sheet.dart';
import 'package:x_pr/app/pages/setting/setting_page.dart';
import 'package:x_pr/app/pages/splash/dialogs/maintenance_dialog.dart';
import 'package:x_pr/app/pages/splash/dialogs/update_dialog.dart';
import 'package:x_pr/app/pages/splash/splash_page.dart';
import 'package:x_pr/app/routes/routes_observer.dart';
import 'package:x_pr/core/theme/components/pages/bottom_sheet_page.dart';
import 'package:x_pr/core/theme/components/pages/custom_page_transition.dart';
import 'package:x_pr/core/theme/components/pages/dialog_page.dart';
import 'package:x_pr/core/utils/ext/string_ext.dart';
import 'package:x_pr/features/config/domain/entities/maintenance_dialog_data.dart';
import 'package:x_pr/features/config/domain/entities/notice_dialog_data.dart';
import 'package:x_pr/features/config/domain/entities/update_dialog_data.dart';

part 'routes_helper.dart';

Expand Down Expand Up @@ -64,168 +36,4 @@ enum Routes {

@override
String toString() => name;

static final GlobalKey<NavigatorState> navigatorKey =
config.routerDelegate.navigatorKey;

static BuildContext get context => Routes.navigatorKey.currentContext!;

static final GoRouter config = GoRouter(
observers: [
RoutesObserver(),
],
routes: [
/// Splash
GoRoute(
path: '/',
name: Routes.splashPage.name,
builder: (context, state) => const SplashPage(),
),
GoRoute(
path: '/update',
name: Routes.updateDialog.name,
pageBuilder: (context, state) => DialogPage(
route: Routes.updateDialog,
barrierDismissible: false,
child: UpdateDialog(
updateDialogData: state.extra as UpdateDialogData,
),
),
),
GoRoute(
path: '/maintenance',
name: Routes.maintenanceDialog.name,
pageBuilder: (context, state) => DialogPage(
route: Routes.maintenanceDialog,
barrierDismissible: false,
child: MaintenanceDialog(
maintenanceDialogData: state.extra as MaintenanceDialogData,
),
),
),
GoRoute(
path: '/nickname',
name: Routes.nicknamePage.name,
builder: (context, state) => const NicknamePage(),
),

/// Home
GoRoute(
path: '/home',
name: Routes.homePage.name,
pageBuilder: (context, state) {
return CustomPageTransition.page(
const HomePage(),
name: Routes.homePage.name,
isVertical: true,
);
},
),
GoRoute(
path: '/home/join',
name: Routes.joinPage.name,
pageBuilder: (context, state) {
return CustomPageTransition.page(
const JoinPage(),
name: Routes.joinPage.name,
isBlur: true,
);
},
),
GoRoute(
path: '/home/notice',
name: Routes.noticeDialog.name,
pageBuilder: (context, state) => DialogPage(
route: Routes.noticeDialog,
child: NoticeDialog(
noticeData: state.extra as NoticeDialogData,
),
),
),

/// Game
GoRoute(
path: '/home/game',
name: Routes.gamePage.name,
builder: (context, state) => const GamePage(),
),
GoRoute(
path: '/home/game/exit',
name: Routes.gameExitDialog.name,
pageBuilder: (context, state) => const DialogPage(
route: Routes.gameExitDialog,
child: GameExitConfirmDialog(),
),
),

/// Setting
GoRoute(
path: '/home/setting',
name: Routes.settingPage.name,
builder: (context, state) => const SettingPage(),
),
GoRoute(
path: '/home/setting/editNickname',
name: Routes.editNicknamePage.name,
pageBuilder: (context, state) {
return CustomPageTransition.page(
const EditNicknamePage(),
name: Routes.editNicknamePage.name,
isBlur: true,
);
},
),
GoRoute(
path: '/home/setting/language',
name: Routes.languageBottomSheet.name,
pageBuilder: (context, state) => const BottomSheetPage(
route: Routes.languageBottomSheet,
child: LanguageBottomSheet(),
),
),
GoRoute(
path: '/home/setting/license',
name: Routes.licensePage.name,
builder: (context, state) => const AppLicensePage(),
),

/// Dev
GoRoute(
path: '/home/setting/dev',
name: Routes.devPage.name,
builder: (context, state) => const DevPage(),
),
GoRoute(
path: '/home/setting/dev/log',
name: Routes.devLogPage.name,
builder: (context, state) => const LogPage(),
),
GoRoute(
path: '/home/setting/dev/component',
name: Routes.devComponentPage.name,
builder: (context, state) => const ComponentPage(),
),
GoRoute(
path: '/home/setting/dev/local_data',
name: Routes.devLocalDataPage.name,
builder: (context, state) => const LocalDataPage(),
),
GoRoute(
path: '/home/setting/dev/local_data/logout',
name: Routes.devLogoutDialog.name,
pageBuilder: (context, state) => const DialogPage(
route: Routes.devLogoutDialog,
child: LogoutDialog(),
),
),
GoRoute(
path: '/home/setting/dev/local_data/login',
// name: Routes.devLoginBottomSheet.name,
pageBuilder: (context, state) => const BottomSheetPage(
route: Routes.devLoginBottomSheet,
child: LoginBottomSheet(),
),
),
],
);
}
23 changes: 8 additions & 15 deletions lib/app/routes/routes_helper.dart
Original file line number Diff line number Diff line change
@@ -1,20 +1,13 @@
part of 'routes.dart';

extension RoutesHelper on BuildContext {
Future<T?> bottomSheet<T>(
Widget bottomSheet, {
String? name,
bool isScrollControlled = false,
Color? backgroundColor,
}) {
return showModalBottomSheet<T>(
context: this,
builder: (_) => bottomSheet,
routeSettings: RouteSettings(
name: (name ?? "${bottomSheet.runtimeType}").toLowerFirst(),
),
isScrollControlled: isScrollControlled,
backgroundColor: backgroundColor,
);
void popUntil(Routes target) {
final delegate = GoRouter.of(this).routerDelegate;
final routes = delegate.currentConfiguration.routes;
for (int i = routes.length - 1; i >= 0; i--) {
final route = routes[i] as GoRoute;
if (route.name == target.name) break;
pop();
}
}
}
Loading

0 comments on commit 2a60840

Please sign in to comment.