routing scaffolding

This commit is contained in:
austinried 2025-10-19 18:48:53 +09:00
parent 9bd0e07c44
commit cc168eefcd
7 changed files with 153 additions and 15 deletions

View File

@ -1,11 +1,40 @@
import 'package:go_router/go_router.dart'; 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( final router = GoRouter(
routes: [ 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( GoRoute(
path: '/', path: '/now-playing',
builder: (context, state) => HomeScreen(), builder: (context, state) => NowPlayingScreen(),
),
GoRoute(
path: '/settings',
builder: (context, state) => SettingsScreen(),
), ),
], ],
); );

View File

@ -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...'),
),
],
),
),
);
}
}

View File

@ -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!')),
);
}
}

View File

@ -1,16 +1,17 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:material_symbols_icons/symbols.dart'; import 'package:material_symbols_icons/symbols.dart';
import '../util/custom_scroll_fix.dart'; import '../util/custom_scroll_fix.dart';
class HomeScreen extends StatefulWidget { class LibraryScreen extends StatefulWidget {
const HomeScreen({super.key}); const LibraryScreen({super.key});
@override @override
State<HomeScreen> createState() => _HomeScreenState(); State<LibraryScreen> createState() => _LibraryScreenState();
} }
class _HomeScreenState extends State<HomeScreen> class _LibraryScreenState extends State<LibraryScreen>
with SingleTickerProviderStateMixin { with SingleTickerProviderStateMixin {
late final TabController tabController; late final TabController tabController;
@ -18,11 +19,11 @@ class _HomeScreenState extends State<HomeScreen>
final tabHeight = 32.0; final tabHeight = 32.0;
late final List<(String, Widget)> tabs = [ late final List<(String, Widget)> tabs = [
("Home", Icon(Symbols.home_rounded, size: iconSize)), ('Home', Icon(Symbols.home_rounded, size: iconSize)),
("Albums", Icon(Symbols.album_rounded, size: iconSize)), ('Albums', Icon(Symbols.album_rounded, size: iconSize)),
("Artists", Icon(Symbols.person_rounded, size: iconSize)), ('Artists', Icon(Symbols.person_rounded, size: iconSize)),
("Songs", Icon(Symbols.music_note_rounded, size: iconSize)), ('Songs', Icon(Symbols.music_note_rounded, size: iconSize)),
("Playlists", Icon(Symbols.playlist_play_rounded, size: iconSize)), ('Playlists', Icon(Symbols.playlist_play_rounded, size: iconSize)),
]; ];
@override @override
@ -69,7 +70,7 @@ class _HomeScreenState extends State<HomeScreen>
vertical: 16, vertical: 16,
), ),
child: Text( child: Text(
"Albums", 'Albums',
style: TextTheme.of(context).headlineLarge?.copyWith( style: TextTheme.of(context).headlineLarge?.copyWith(
fontWeight: FontWeight.w800, fontWeight: FontWeight.w800,
), ),
@ -125,7 +126,9 @@ class _HomeScreenState extends State<HomeScreen>
.toList(), .toList(),
), ),
IconButton( IconButton(
onPressed: () {}, onPressed: () {
context.push('/settings');
},
icon: Icon( icon: Icon(
Symbols.settings_rounded, Symbols.settings_rounded,
), ),
@ -205,7 +208,9 @@ class _NewWidgetState extends State<NewWidget>
(BuildContext context, int index) { (BuildContext context, int index) {
return ListTile( return ListTile(
title: Text('Item $index'), title: Text('Item $index'),
onTap: () {}, onTap: () {
context.push('/album');
},
); );
}, },
childCount: 30, childCount: 30,

View File

@ -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...'),
),
],
),
),
);
}
}

View File

@ -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...'),
),
),
),
);
}
}

View File

@ -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!')),
);
}
}