Skip to content

Commit 1c8d5b4

Browse files
committed
feat: implement routing management with go_router integration
1 parent 21df36e commit 1c8d5b4

File tree

3 files changed

+90
-20
lines changed

3 files changed

+90
-20
lines changed

lib/main.dart

Lines changed: 70 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import 'package:flutter/foundation.dart';
22
import 'package:flutter/material.dart';
3+
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
4+
import 'package:go_router/go_router.dart';
35
import 'package:url_launcher/url_launcher.dart';
46

57
import 'shader_builder.dart';
@@ -11,6 +13,8 @@ import 'shader_screen.dart';
1113
import 'tv_test_screen.dart';
1214

1315
void main() {
16+
usePathUrlStrategy();
17+
1418
runApp(const RgbGlitchDemo());
1519
}
1620

@@ -81,6 +85,52 @@ final shaders = [
8185
),
8286
];
8387

88+
// Helper function to create URL-safe shader names
89+
String shaderNameToPath(String name) {
90+
return name.toLowerCase().replaceAll(' ', '-');
91+
}
92+
93+
// Helper function to find shader by path
94+
ShaderInfo? findShaderByPath(String path) {
95+
try {
96+
return shaders.firstWhere(
97+
(shader) => shaderNameToPath(shader.name) == path,
98+
);
99+
} catch (e) {
100+
return null;
101+
}
102+
}
103+
104+
// Router configuration
105+
final GoRouter _router = GoRouter(
106+
routes: [
107+
GoRoute(
108+
path: '/',
109+
name: 'home',
110+
builder: (context, state) => const HomeScreen(),
111+
),
112+
GoRoute(
113+
path: '/shader/:shaderName',
114+
name: 'shader',
115+
builder: (context, state) {
116+
final shaderName = state.pathParameters['shaderName']!;
117+
final shaderInfo = findShaderByPath(shaderName);
118+
119+
if (shaderInfo == null) {
120+
// If shader not found, redirect to home
121+
WidgetsBinding.instance.addPostFrameCallback((_) {
122+
context.go('/');
123+
});
124+
return const HomeScreen();
125+
}
126+
127+
return ShaderScreen(shaderInfo: shaderInfo);
128+
},
129+
),
130+
],
131+
errorBuilder: (context, state) => const HomeScreen(),
132+
);
133+
84134
// Custom page transition builder that provides no animation (instant transition)
85135
class _NoTransitionPageTransitionsBuilder extends PageTransitionsBuilder {
86136
const _NoTransitionPageTransitionsBuilder();
@@ -107,22 +157,27 @@ class RgbGlitchDemo extends StatefulWidget {
107157
class _RgbGlitchDemoState extends State<RgbGlitchDemo> {
108158
@override
109159
Widget build(BuildContext context) {
110-
return MaterialApp(
160+
return MaterialApp.router(
111161
debugShowCheckedModeBanner: false,
162+
routerConfig: _router,
112163
theme: ThemeData.dark(useMaterial3: true).copyWith(
113-
pageTransitionsTheme: kIsWeb
114-
? PageTransitionsTheme(
115-
builders: {
116-
TargetPlatform.android: const _NoTransitionPageTransitionsBuilder(),
117-
TargetPlatform.iOS: const _NoTransitionPageTransitionsBuilder(),
118-
TargetPlatform.linux: const _NoTransitionPageTransitionsBuilder(),
119-
TargetPlatform.macOS: const _NoTransitionPageTransitionsBuilder(),
120-
TargetPlatform.windows: const _NoTransitionPageTransitionsBuilder(),
121-
},
122-
)
123-
: null,
164+
pageTransitionsTheme: kIsWeb
165+
? PageTransitionsTheme(
166+
builders: {
167+
TargetPlatform.android:
168+
const _NoTransitionPageTransitionsBuilder(),
169+
TargetPlatform.iOS:
170+
const _NoTransitionPageTransitionsBuilder(),
171+
TargetPlatform.linux:
172+
const _NoTransitionPageTransitionsBuilder(),
173+
TargetPlatform.macOS:
174+
const _NoTransitionPageTransitionsBuilder(),
175+
TargetPlatform.windows:
176+
const _NoTransitionPageTransitionsBuilder(),
177+
},
178+
)
179+
: null,
124180
),
125-
home: const HomeScreen(),
126181
);
127182
}
128183
}
@@ -150,12 +205,8 @@ class HomeScreen extends StatelessWidget {
150205
return _ShaderTile(
151206
shaderInfo: shaderInfo,
152207
onTap: () {
153-
Navigator.of(context).push(
154-
MaterialPageRoute(
155-
builder: (context) =>
156-
ShaderScreen(shaderInfo: shaderInfo),
157-
),
158-
);
208+
final shaderPath = shaderNameToPath(shaderInfo.name);
209+
context.go('/shader/$shaderPath');
159210
},
160211
);
161212
},

pubspec.lock

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,18 @@ packages:
8484
source: sdk
8585
version: "0.0.0"
8686
flutter_web_plugins:
87-
dependency: transitive
87+
dependency: "direct main"
8888
description: flutter
8989
source: sdk
9090
version: "0.0.0"
91+
go_router:
92+
dependency: "direct main"
93+
description:
94+
name: go_router
95+
sha256: f02fd7d2a4dc512fec615529824fdd217fecb3a3d3de68360293a551f21634b3
96+
url: "https://pub.dev"
97+
source: hosted
98+
version: "14.8.1"
9199
leak_tracker:
92100
dependency: transitive
93101
description:
@@ -120,6 +128,14 @@ packages:
120128
url: "https://pub.dev"
121129
source: hosted
122130
version: "5.1.1"
131+
logging:
132+
dependency: transitive
133+
description:
134+
name: logging
135+
sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
136+
url: "https://pub.dev"
137+
source: hosted
138+
version: "1.3.0"
123139
matcher:
124140
dependency: transitive
125141
description:

pubspec.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,15 @@ environment:
1111
dependencies:
1212
flutter:
1313
sdk: flutter
14+
flutter_web_plugins:
15+
sdk: flutter
1416
flutter_shaders: ^0.1.0
1517

1618
# The following adds the Cupertino Icons font to your application.
1719
cupertino_icons: ^1.0.8
1820
url_launcher: ^6.3.2
1921
path: ^1.9.1
22+
go_router: ^14.6.2
2023

2124
dev_dependencies:
2225
flutter_test:

0 commit comments

Comments
 (0)