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: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(),
),
],
);

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: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<HomeScreen> createState() => _HomeScreenState();
State<LibraryScreen> createState() => _LibraryScreenState();
}
class _HomeScreenState extends State<HomeScreen>
class _LibraryScreenState extends State<LibraryScreen>
with SingleTickerProviderStateMixin {
late final TabController tabController;
@ -18,11 +19,11 @@ class _HomeScreenState extends State<HomeScreen>
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<HomeScreen>
vertical: 16,
),
child: Text(
"Albums",
'Albums',
style: TextTheme.of(context).headlineLarge?.copyWith(
fontWeight: FontWeight.w800,
),
@ -125,7 +126,9 @@ class _HomeScreenState extends State<HomeScreen>
.toList(),
),
IconButton(
onPressed: () {},
onPressed: () {
context.push('/settings');
},
icon: Icon(
Symbols.settings_rounded,
),
@ -205,7 +208,9 @@ class _NewWidgetState extends State<NewWidget>
(BuildContext context, int index) {
return ListTile(
title: Text('Item $index'),
onTap: () {},
onTap: () {
context.push('/album');
},
);
},
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!')),
);
}
}