Skip to content
This repository was archived by the owner on Apr 3, 2023. It is now read-only.

Commit 1ec7618

Browse files
committed
Use auto_route
1 parent 249359b commit 1ec7618

15 files changed

+335
-143
lines changed

analysis_options.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ analyzer:
1313
implicit-dynamic: false
1414
exclude:
1515
- "**/*.g.dart"
16+
- "**/*.gr.dart"
1617
- "**/*.freezed.dart"
1718

1819
linter:

build_runner.sh

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#!/bin/bash
22
find . -name "*.g.dart" -type f -delete;
3+
find . -name "*.gr.dart" -type f -delete;
34
find . -name "*.freezed.dart" -type f -delete;
4-
flutter packages pub run build_runner build --delete-conflicting-outputs
5+
flutter packages pub run build_runner build --delete-conflicting-outputs

lib/game/game_widget.dart lib/game/game_page.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@ import 'pause_dialog.dart';
1515
import 'tile/tile.dart';
1616
import 'tile/tile_converter.dart';
1717

18-
class GameWidget extends ConsumerWidget {
18+
class GamePage extends ConsumerWidget {
1919
final MyGame _game;
20+
final Map<String, dynamic> arguments;
2021

21-
GameWidget({Key? key})
22+
GamePage({Key? key, required this.arguments})
2223
: _game = MyGame(),
2324
super(key: key);
2425

2526
@override
2627
Widget build(BuildContext context, ScopedReader watch) {
27-
final arguments = ModalRoute.of(context)!.settings.arguments as Map;
2828
final midiLoaded = watch(midiProvider);
2929
if (!midiLoaded) {
3030
return const LoadingSoundWidget();

lib/game_config/game_config_page.dart

+23-8
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
1+
import 'package:auto_route/auto_route.dart';
12
import 'package:flutter/material.dart';
23
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
34
import 'package:flutter_riverpod/flutter_riverpod.dart';
45
import 'package:sprintf/sprintf.dart';
56

6-
import '../routes.dart';
7+
import '../game/colors.dart';
8+
import '../router/router.dart';
79
import '../songs/song.dart';
810
import 'game_config_model.dart';
911

1012
class GameConfigPage extends ConsumerWidget {
13+
final Song song;
14+
15+
GameConfigPage({required this.song});
16+
1117
@override
1218
Widget build(BuildContext context, ScopedReader watch) {
13-
final song = ModalRoute.of(context)!.settings.arguments as Song;
1419
final gameConfigState = watch(gameConfigStateProvider);
1520

1621
return Scaffold(
@@ -129,12 +134,22 @@ class GameConfigPage extends ConsumerWidget {
129134
Expanded(
130135
child: ElevatedButton(
131136
onPressed: () {
132-
Navigator.pushNamed(context, Routes.game,
133-
arguments: <String, dynamic>{
134-
'song': song,
135-
'difficulty': gameConfigState.difficulty,
136-
'speed': gameConfigState.speed
137-
});
137+
primaryColor = Theme.of(context).colorScheme.primary;
138+
secondaryColor =
139+
Theme.of(context).colorScheme.secondary;
140+
backgroundColor =
141+
Theme.of(context).colorScheme.background;
142+
onBackgroundColor =
143+
Theme.of(context).colorScheme.onBackground;
144+
paint = Paint()
145+
..colorFilter =
146+
ColorFilter.mode(primaryColor, BlendMode.srcIn);
147+
AutoRouter.of(context)
148+
.push(GameRoute(arguments: <String, dynamic>{
149+
'song': song,
150+
'difficulty': gameConfigState.difficulty,
151+
'speed': gameConfigState.speed
152+
}));
138153
},
139154
child: Text(AppLocalizations.of(context)!.txt_start)),
140155
),

lib/home/home_page.dart

+30-30
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
import 'package:auto_route/auto_route.dart';
12
import 'package:flutter/material.dart';
23
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
34
import 'package:flutter_hooks/flutter_hooks.dart';
45
import 'package:flutter_riverpod/flutter_riverpod.dart';
56

67
import '../midi/midi_model.dart';
7-
import '../routes.dart';
8+
import '../router/router.dart';
89
import '../search/search_widget.dart';
910
import '../songs/songs_model.dart';
1011
import '../songs/songs_widget.dart';
@@ -39,36 +40,35 @@ class HomePage extends HookWidget {
3940
image: const AssetImage('assets/images/img_guitar.png'),
4041
color: Theme.of(context).appBarTheme.iconTheme!.color,
4142
),
42-
onPressed: () async {
43-
await Navigator.pushNamed(context, Routes.instrument);
44-
}),
45-
IconButton(icon: ClipOval(child: Consumer(
46-
builder: (context, watch, child) {
47-
// FIXME To load midi
48-
watch(midiProvider);
49-
final user = watch(userProvider);
50-
return user.when(
51-
data: (user) => Image.network(
52-
user.photoUrl,
53-
errorBuilder: (context, exception, stackTrace) {
54-
return const Icon(
55-
Icons.account_circle_rounded);
56-
},
57-
),
58-
loading: () =>
59-
const Icon(Icons.account_circle_rounded),
60-
error: (_, __) =>
61-
const Icon(Icons.account_circle_rounded));
62-
},
63-
)), onPressed: () async {
64-
await Navigator.pushNamed(context, Routes.account);
65-
}),
43+
onPressed: () => AutoRouter.of(context)
44+
.push(const InstrumentsRoute())),
6645
IconButton(
67-
icon: const Icon(Icons.settings),
68-
onPressed: () async {
69-
await Navigator.pushNamed(context, Routes.setting);
70-
},
71-
),
46+
icon: ClipOval(child: Consumer(
47+
builder: (context, watch, child) {
48+
// FIXME To load midi
49+
watch(midiProvider);
50+
final user = watch(userProvider);
51+
return user.when(
52+
data: (user) => Image.network(
53+
user.photoUrl,
54+
errorBuilder:
55+
(context, exception, stackTrace) {
56+
return const Icon(
57+
Icons.account_circle_rounded);
58+
},
59+
),
60+
loading: () =>
61+
const Icon(Icons.account_circle_rounded),
62+
error: (_, __) =>
63+
const Icon(Icons.account_circle_rounded));
64+
},
65+
)),
66+
onPressed: () =>
67+
AutoRouter.of(context).push(const UserRoute())),
68+
IconButton(
69+
icon: const Icon(Icons.settings),
70+
onPressed: () =>
71+
AutoRouter.of(context).push(const SettingsRoute())),
7272
],
7373
bottom: TabBar(
7474
isScrollable: true,

lib/main.dart

+10-47
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,13 @@
1+
import 'package:auto_route/auto_route.dart';
12
import 'package:flutter/material.dart';
23
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
34
import 'package:flutter_riverpod/flutter_riverpod.dart';
45
import 'package:shared_preferences/shared_preferences.dart';
56

6-
import 'game/colors.dart';
7-
import 'game/game_widget.dart';
8-
import 'game_config/game_config_page.dart';
9-
import 'home/home_page.dart';
10-
import 'instrument/instruments_page.dart';
117
import 'locale/locale_model.dart';
12-
import 'locale/locale_page.dart';
138
import 'preferences.dart';
14-
import 'routes.dart';
15-
import 'setting/settings_page.dart';
16-
import 'splash_page.dart';
9+
import 'router/router.dart';
1710
import 'theme/theme_model.dart';
18-
import 'theme/theme_page.dart';
19-
import 'user/user_page.dart';
2011

2112
class Logger extends ProviderObserver {
2213
@override
@@ -44,11 +35,13 @@ Future<void> main() async {
4435
}
4536

4637
class App extends ConsumerWidget {
38+
final _rootRouter = RootRouter();
39+
4740
@override
4841
Widget build(BuildContext context, ScopedReader watch) {
4942
final themeMode = watch(themeModeProvider);
5043
final locale = watch(localeProvider);
51-
return MaterialApp(
44+
return MaterialApp.router(
5245
title: 'Hit Notes',
5346
debugShowCheckedModeBanner: false,
5447
locale: locale,
@@ -57,41 +50,11 @@ class App extends ConsumerWidget {
5750
themeMode: themeMode,
5851
theme: buildTheme(),
5952
darkTheme: buildTheme(isDark: true),
60-
routes: {
61-
Routes.splash: (context) {
62-
return SplashPage();
63-
},
64-
Routes.home: (context) {
65-
return HomePage();
66-
},
67-
Routes.gameConfig: (context) {
68-
return GameConfigPage();
69-
},
70-
Routes.game: (context) {
71-
primaryColor = Theme.of(context).colorScheme.primary;
72-
secondaryColor = Theme.of(context).colorScheme.secondary;
73-
backgroundColor = Theme.of(context).colorScheme.background;
74-
onBackgroundColor = Theme.of(context).colorScheme.onBackground;
75-
paint = Paint()
76-
..colorFilter = ColorFilter.mode(primaryColor, BlendMode.srcIn);
77-
return GameWidget();
78-
},
79-
Routes.account: (context) {
80-
return UserPage();
81-
},
82-
Routes.language: (context) {
83-
return LocalePage();
84-
},
85-
Routes.theme: (context) {
86-
return ThemePage();
87-
},
88-
Routes.instrument: (context) {
89-
return InstrumentsPage();
90-
},
91-
Routes.setting: (context) {
92-
return SettingsPage();
93-
},
94-
},
53+
routerDelegate: AutoRouterDelegate(
54+
_rootRouter,
55+
navigatorObservers: () => [AutoRouteObserver()],
56+
),
57+
routeInformationParser: _rootRouter.defaultRouteParser(),
9558
);
9659
}
9760
}

lib/router/router.dart

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import 'package:auto_route/auto_route.dart';
2+
3+
import '../game/game_page.dart';
4+
import '../game_config/game_config_page.dart';
5+
import '../home/home_page.dart';
6+
import '../instrument/instruments_page.dart';
7+
import '../locale/locale_page.dart';
8+
import '../setting/settings_page.dart';
9+
import '../splash_page.dart';
10+
import '../theme/theme_page.dart';
11+
import '../user/user_page.dart';
12+
13+
export 'router.gr.dart';
14+
15+
@MaterialAutoRouter(
16+
replaceInRouteName: 'Page,Route',
17+
routes: <AutoRoute>[
18+
// app stack
19+
AutoRoute<dynamic>(
20+
path: '/',
21+
page: SplashPage,
22+
),
23+
AutoRoute<dynamic>(
24+
path: '/home',
25+
page: HomePage,
26+
),
27+
AutoRoute<dynamic>(
28+
path: '/gameConfig',
29+
page: GameConfigPage,
30+
),
31+
AutoRoute<dynamic>(
32+
path: '/game',
33+
page: GamePage,
34+
),
35+
AutoRoute<dynamic>(
36+
path: '/user',
37+
page: UserPage,
38+
),
39+
AutoRoute<dynamic>(
40+
path: '/locale',
41+
page: LocalePage,
42+
),
43+
AutoRoute<dynamic>(
44+
path: '/theme',
45+
page: ThemePage,
46+
),
47+
AutoRoute<dynamic>(
48+
path: '/instrument',
49+
page: InstrumentsPage,
50+
),
51+
AutoRoute<dynamic>(
52+
path: '/setting',
53+
page: SettingsPage,
54+
),
55+
],
56+
)
57+
class $RootRouter {}

0 commit comments

Comments
 (0)