From cc168eefcd4d8c5a9181bcef706382dbcd5fded5 Mon Sep 17 00:00:00 2001 From: austinried <4966622+austinried@users.noreply.github.com> Date: Sun, 19 Oct 2025 18:48:53 +0900 Subject: [PATCH] routing scaffolding --- lib/router.dart | 35 +++++++++++++++++-- lib/screens/album_screen.dart | 26 ++++++++++++++ lib/screens/artist_screen.dart | 12 +++++++ .../{home.dart => library_screen.dart} | 29 ++++++++------- lib/screens/now_playing_screen.dart | 26 ++++++++++++++ lib/screens/root_shell_screen.dart | 28 +++++++++++++++ lib/screens/settings_screen.dart | 12 +++++++ 7 files changed, 153 insertions(+), 15 deletions(-) create mode 100644 lib/screens/album_screen.dart create mode 100644 lib/screens/artist_screen.dart rename lib/screens/{home.dart => library_screen.dart} (89%) create mode 100644 lib/screens/now_playing_screen.dart create mode 100644 lib/screens/root_shell_screen.dart create mode 100644 lib/screens/settings_screen.dart diff --git a/lib/router.dart b/lib/router.dart index d7f809a..f202789 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -1,11 +1,40 @@ import 'package:go_router/go_router.dart'; -import 'package:subtracks/screens/home.dart'; + +import 'screens/album_screen.dart'; +import 'screens/artist_screen.dart'; +import 'screens/library_screen.dart'; +import 'screens/now_playing_screen.dart'; +import 'screens/root_shell_screen.dart'; +import 'screens/settings_screen.dart'; final router = GoRouter( routes: [ + ShellRoute( + builder: (context, state, child) => RootShellScreen(child: child), + routes: [ + GoRoute( + path: '/', + builder: (context, state) => LibraryScreen(), + routes: [ + GoRoute( + path: 'album', + builder: (context, state) => AlbumScreen(), + ), + GoRoute( + path: 'artist', + builder: (context, state) => ArtistScreen(), + ), + ], + ), + ], + ), GoRoute( - path: '/', - builder: (context, state) => HomeScreen(), + path: '/now-playing', + builder: (context, state) => NowPlayingScreen(), + ), + GoRoute( + path: '/settings', + builder: (context, state) => SettingsScreen(), ), ], ); diff --git a/lib/screens/album_screen.dart b/lib/screens/album_screen.dart new file mode 100644 index 0000000..5183b53 --- /dev/null +++ b/lib/screens/album_screen.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +class AlbumScreen extends StatelessWidget { + const AlbumScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('Album!'), + TextButton( + onPressed: () { + context.push('/artist'); + }, + child: Text('Artist...'), + ), + ], + ), + ), + ); + } +} diff --git a/lib/screens/artist_screen.dart b/lib/screens/artist_screen.dart new file mode 100644 index 0000000..3241e6d --- /dev/null +++ b/lib/screens/artist_screen.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; + +class ArtistScreen extends StatelessWidget { + const ArtistScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center(child: Text('Artist!')), + ); + } +} diff --git a/lib/screens/home.dart b/lib/screens/library_screen.dart similarity index 89% rename from lib/screens/home.dart rename to lib/screens/library_screen.dart index 3b3b296..4bfde14 100644 --- a/lib/screens/home.dart +++ b/lib/screens/library_screen.dart @@ -1,16 +1,17 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:material_symbols_icons/symbols.dart'; import '../util/custom_scroll_fix.dart'; -class HomeScreen extends StatefulWidget { - const HomeScreen({super.key}); +class LibraryScreen extends StatefulWidget { + const LibraryScreen({super.key}); @override - State createState() => _HomeScreenState(); + State createState() => _LibraryScreenState(); } -class _HomeScreenState extends State +class _LibraryScreenState extends State with SingleTickerProviderStateMixin { late final TabController tabController; @@ -18,11 +19,11 @@ class _HomeScreenState extends State final tabHeight = 32.0; late final List<(String, Widget)> tabs = [ - ("Home", Icon(Symbols.home_rounded, size: iconSize)), - ("Albums", Icon(Symbols.album_rounded, size: iconSize)), - ("Artists", Icon(Symbols.person_rounded, size: iconSize)), - ("Songs", Icon(Symbols.music_note_rounded, size: iconSize)), - ("Playlists", Icon(Symbols.playlist_play_rounded, size: iconSize)), + ('Home', Icon(Symbols.home_rounded, size: iconSize)), + ('Albums', Icon(Symbols.album_rounded, size: iconSize)), + ('Artists', Icon(Symbols.person_rounded, size: iconSize)), + ('Songs', Icon(Symbols.music_note_rounded, size: iconSize)), + ('Playlists', Icon(Symbols.playlist_play_rounded, size: iconSize)), ]; @override @@ -69,7 +70,7 @@ class _HomeScreenState extends State vertical: 16, ), child: Text( - "Albums", + 'Albums', style: TextTheme.of(context).headlineLarge?.copyWith( fontWeight: FontWeight.w800, ), @@ -125,7 +126,9 @@ class _HomeScreenState extends State .toList(), ), IconButton( - onPressed: () {}, + onPressed: () { + context.push('/settings'); + }, icon: Icon( Symbols.settings_rounded, ), @@ -205,7 +208,9 @@ class _NewWidgetState extends State (BuildContext context, int index) { return ListTile( title: Text('Item $index'), - onTap: () {}, + onTap: () { + context.push('/album'); + }, ); }, childCount: 30, diff --git a/lib/screens/now_playing_screen.dart b/lib/screens/now_playing_screen.dart new file mode 100644 index 0000000..a82a5c1 --- /dev/null +++ b/lib/screens/now_playing_screen.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +class NowPlayingScreen extends StatelessWidget { + const NowPlayingScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('Now Playing!'), + TextButton( + onPressed: () { + context.go('/album'); + }, + child: Text('Album...'), + ), + ], + ), + ), + ); + } +} diff --git a/lib/screens/root_shell_screen.dart b/lib/screens/root_shell_screen.dart new file mode 100644 index 0000000..e97ee31 --- /dev/null +++ b/lib/screens/root_shell_screen.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +class RootShellScreen extends StatelessWidget { + const RootShellScreen({ + super.key, + required this.child, + }); + + final Widget child; + + @override + Widget build(BuildContext context) { + return Scaffold( + body: child, + bottomNavigationBar: BottomAppBar( + child: Center( + child: TextButton( + onPressed: () { + context.push('/now-playing'); + }, + child: Text('Now playing...'), + ), + ), + ), + ); + } +} diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart new file mode 100644 index 0000000..20b1300 --- /dev/null +++ b/lib/screens/settings_screen.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; + +class SettingsScreen extends StatelessWidget { + const SettingsScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center(child: Text('Settings!')), + ); + } +}