11import 'package:flutter/foundation.dart' ;
22import 'package:flutter/material.dart' ;
3+ import 'package:flutter_web_plugins/flutter_web_plugins.dart' ;
4+ import 'package:go_router/go_router.dart' ;
35import 'package:url_launcher/url_launcher.dart' ;
46
57import 'shader_builder.dart' ;
@@ -11,6 +13,8 @@ import 'shader_screen.dart';
1113import 'tv_test_screen.dart' ;
1214
1315void 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)
85135class _NoTransitionPageTransitionsBuilder extends PageTransitionsBuilder {
86136 const _NoTransitionPageTransitionsBuilder ();
@@ -107,22 +157,27 @@ class RgbGlitchDemo extends StatefulWidget {
107157class _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 },
0 commit comments