Skip to content

Commit 6107849

Browse files
authored
chore: detach routing from library (#1230)
1 parent 2718237 commit 6107849

File tree

61 files changed

+610
-514
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+610
-514
lines changed

lib/app/view/create_master_items.dart

Lines changed: 116 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -27,114 +27,124 @@ import '../../radio/view/station_title.dart';
2727
import '../../search/view/search_page.dart';
2828
import '../../settings/view/settings_page.dart';
2929
import 'main_page_icon.dart';
30-
import 'master_items.dart';
30+
import 'master_item.dart';
3131

32-
List<MasterItem> createMasterItems() {
33-
final libraryModel = di<LibraryModel>();
34-
return [
35-
MasterItem(
36-
titleBuilder: (context) => Text(context.l10n.search),
37-
pageBuilder: (_) => const SearchPage(),
38-
iconBuilder: (_) => Icon(Iconz.search),
39-
pageId: PageIDs.searchPage,
40-
),
41-
MasterItem(
42-
titleBuilder: (context) => Text(context.l10n.local),
43-
pageBuilder: (_) => const LocalAudioPage(),
44-
iconBuilder: (selected) => MainPageIcon(
45-
audioType: AudioType.local,
46-
selected: selected,
47-
),
48-
pageId: PageIDs.localAudio,
49-
),
50-
MasterItem(
51-
titleBuilder: (context) => Text(context.l10n.radio),
52-
pageBuilder: (_) => const RadioPage(),
53-
iconBuilder: (selected) => MainPageIcon(
54-
audioType: AudioType.radio,
55-
selected: selected,
56-
),
57-
pageId: PageIDs.radio,
58-
),
59-
MasterItem(
60-
titleBuilder: (context) => Text(context.l10n.podcasts),
61-
pageBuilder: (_) => const PodcastsPage(),
62-
iconBuilder: (selected) => MainPageIcon(
63-
audioType: AudioType.podcast,
64-
selected: selected,
65-
),
66-
pageId: PageIDs.podcasts,
67-
),
68-
if (AppConfig.isMobilePlatform)
69-
MasterItem(
70-
titleBuilder: (context) => Text(context.l10n.settings),
71-
iconBuilder: (selected) =>
72-
Icon(selected ? Iconz.settingsFilled : Iconz.settings),
73-
pageBuilder: (context) => const SettingsPage(),
74-
pageId: PageIDs.settings,
75-
),
76-
if (AppConfig.isMobilePlatform)
77-
MasterItem(
78-
titleBuilder: (context) => Text(context.l10n.home),
79-
iconBuilder: (selected) =>
80-
Icon(selected ? Iconz.homeFilled : Iconz.home),
81-
pageBuilder: (context) => const HomePage(),
82-
pageId: PageIDs.homePage,
83-
),
32+
Iterable<MasterItem> getAllMasterItems() => [
33+
...permanentMasterItems,
34+
...createPlaylistMasterItems(),
35+
...createPodcastMasterItems(),
36+
...createFavoriteAlbumsMasterItems(),
37+
...createStarredStationsMasterItems(),
38+
];
39+
40+
Iterable<MasterItem> permanentMasterItems = [
41+
MasterItem(
42+
titleBuilder: (context) => Text(context.l10n.search),
43+
pageBuilder: (_) => const SearchPage(),
44+
iconBuilder: (_) => Icon(Iconz.search),
45+
pageId: PageIDs.searchPage,
46+
),
47+
MasterItem(
48+
titleBuilder: (context) => Text(context.l10n.local),
49+
pageBuilder: (_) => const LocalAudioPage(),
50+
iconBuilder: (selected) =>
51+
MainPageIcon(audioType: AudioType.local, selected: selected),
52+
pageId: PageIDs.localAudio,
53+
),
54+
MasterItem(
55+
titleBuilder: (context) => Text(context.l10n.radio),
56+
pageBuilder: (_) => const RadioPage(),
57+
iconBuilder: (selected) =>
58+
MainPageIcon(audioType: AudioType.radio, selected: selected),
59+
pageId: PageIDs.radio,
60+
),
61+
MasterItem(
62+
titleBuilder: (context) => Text(context.l10n.podcasts),
63+
pageBuilder: (_) => const PodcastsPage(),
64+
iconBuilder: (selected) =>
65+
MainPageIcon(audioType: AudioType.podcast, selected: selected),
66+
pageId: PageIDs.podcasts,
67+
),
68+
if (AppConfig.isMobilePlatform)
8469
MasterItem(
85-
iconBuilder: (selected) => Icon(Iconz.plus),
86-
titleBuilder: (context) => Text(context.l10n.add),
87-
pageBuilder: (_) => const CustomContentPage(),
88-
pageId: PageIDs.customContent,
70+
titleBuilder: (context) => Text(context.l10n.settings),
71+
iconBuilder: (selected) =>
72+
Icon(selected ? Iconz.settingsFilled : Iconz.settings),
73+
pageBuilder: (_) => const SettingsPage(),
74+
pageId: PageIDs.settings,
8975
),
76+
if (AppConfig.isMobilePlatform)
9077
MasterItem(
91-
titleBuilder: (context) => Text(context.l10n.likedSongs),
92-
pageId: PageIDs.likedAudios,
93-
pageBuilder: (_) => const LikedAudioPage(),
94-
subtitleBuilder: (context) => Text(context.l10n.playlist),
95-
iconBuilder: (selected) => LikedAudioPageIcon(selected: selected),
78+
titleBuilder: (context) => Text(context.l10n.home),
79+
iconBuilder: (selected) => Icon(selected ? Iconz.homeFilled : Iconz.home),
80+
pageBuilder: (_) => const HomePage(),
81+
pageId: PageIDs.homePage,
9682
),
97-
for (final id in libraryModel.playlistIDs)
98-
MasterItem(
99-
titleBuilder: (context) => Text(id),
100-
subtitleBuilder: (context) => Text(context.l10n.playlist),
101-
pageId: id,
102-
pageBuilder: (_) => PlaylistPage(pageId: id),
103-
iconBuilder: (selected) => SideBarFallBackImage(
104-
color: getAlphabetColor(id),
105-
child: Icon(Iconz.playlist),
106-
),
107-
),
108-
for (final feedUrl in libraryModel.podcastFeedUrls)
109-
MasterItem(
110-
titleBuilder: (_) => PodcastPageTitle(
111-
feedUrl: feedUrl,
112-
),
113-
subtitleBuilder: (context) => PodcastPageSubTitle(feedUrl: feedUrl),
114-
pageId: feedUrl,
115-
pageBuilder: (_) => LazyPodcastPage(feedUrl: feedUrl),
116-
iconBuilder: (selected) => PodcastPageSideBarIcon(feedUrl: feedUrl),
117-
),
118-
for (final id in libraryModel.favoriteAlbums)
119-
MasterItem(
120-
titleBuilder: (context) => Text(id.albumOfId),
121-
subtitleBuilder: (context) => Text(id.artistOfId),
122-
pageId: id,
123-
pageBuilder: (_) => AlbumPage(id: id),
124-
iconBuilder: (selected) => AlbumPageSideBarIcon(
125-
albumId: id,
126-
),
127-
),
128-
for (final uuid in libraryModel.starredStations.where((e) => e.isNotEmpty))
129-
MasterItem(
130-
titleBuilder: (context) => StationTitle(uuid: uuid),
131-
subtitleBuilder: (context) => Text(context.l10n.station),
132-
pageId: uuid,
133-
pageBuilder: (_) => StationPage(uuid: uuid),
134-
iconBuilder: (selected) => StationPageIcon(
135-
uuid: uuid,
136-
selected: selected,
137-
),
138-
),
139-
];
140-
}
83+
MasterItem(
84+
iconBuilder: (selected) => Icon(Iconz.plus),
85+
titleBuilder: (context) => Text(context.l10n.add),
86+
pageBuilder: (_) => const CustomContentPage(),
87+
pageId: PageIDs.customContent,
88+
),
89+
MasterItem(
90+
titleBuilder: (context) => Text(context.l10n.likedSongs),
91+
pageId: PageIDs.likedAudios,
92+
pageBuilder: (_) => const LikedAudioPage(),
93+
subtitleBuilder: (context) => Text(context.l10n.playlist),
94+
iconBuilder: (selected) => LikedAudioPageIcon(selected: selected),
95+
),
96+
];
97+
98+
Iterable<MasterItem> createPlaylistMasterItems() =>
99+
di<LibraryModel>().playlistIDs.map(
100+
(id) => MasterItem(
101+
titleBuilder: (context) => Text(id),
102+
subtitleBuilder: (context) => Text(context.l10n.playlist),
103+
pageId: id,
104+
pageBuilder: (_) => PlaylistPage(pageId: id),
105+
iconBuilder: (selected) => SideBarFallBackImage(
106+
color: getAlphabetColor(id),
107+
child: Icon(Iconz.playlist),
108+
),
109+
),
110+
);
111+
112+
Iterable<MasterItem> createStarredStationsMasterItems() =>
113+
di<LibraryModel>().starredStations.map(
114+
(uuid) => MasterItem(
115+
titleBuilder: (_) => StationTitle(uuid: uuid),
116+
subtitleBuilder: (context) => Text(context.l10n.station),
117+
pageId: uuid,
118+
pageBuilder: (_) => StationPage(uuid: uuid),
119+
iconBuilder: (selected) => StationPageIcon(
120+
uuid: uuid,
121+
selected: selected,
122+
),
123+
),
124+
);
125+
126+
Iterable<MasterItem> createFavoriteAlbumsMasterItems() =>
127+
di<LibraryModel>().favoriteAlbums.map(
128+
(id) => MasterItem(
129+
titleBuilder: (context) => Text(id.albumOfId),
130+
subtitleBuilder: (context) => Text(id.artistOfId),
131+
pageId: id,
132+
pageBuilder: (_) => AlbumPage(id: id),
133+
iconBuilder: (selected) => AlbumPageSideBarIcon(
134+
albumId: id,
135+
),
136+
),
137+
);
138+
139+
Iterable<MasterItem> createPodcastMasterItems() =>
140+
di<LibraryModel>().podcastFeedUrls.map(
141+
(feedUrl) => MasterItem(
142+
titleBuilder: (_) => PodcastPageTitle(
143+
feedUrl: feedUrl,
144+
),
145+
subtitleBuilder: (_) => PodcastPageSubTitle(feedUrl: feedUrl),
146+
pageId: feedUrl,
147+
pageBuilder: (_) => LazyPodcastPage(feedUrl: feedUrl),
148+
iconBuilder: (selected) => PodcastPageSideBarIcon(feedUrl: feedUrl),
149+
),
150+
);

lib/app/view/master_detail_page.dart

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,16 @@ import '../../common/view/global_keys.dart';
1111
import '../../common/view/icons.dart';
1212
import '../../common/view/ui_constants.dart';
1313
import '../../extensions/build_context_x.dart';
14-
import '../../library/library_model.dart';
1514
import 'create_master_items.dart';
1615
import 'master_panel.dart';
16+
import 'routing_manager.dart';
1717

1818
class MasterDetailPage extends StatelessWidget {
1919
const MasterDetailPage({super.key});
2020

2121
@override
2222
Widget build(BuildContext context) {
23-
final libraryModel = di<LibraryModel>();
23+
final routingManager = di<RoutingManager>();
2424

2525
final drawer = Drawer(
2626
width: kMasterDetailSideBarWidth,
@@ -55,12 +55,12 @@ class MasterDetailPage extends StatelessWidget {
5555
if (context.showMasterPanel) const VerticalDivider(),
5656
Expanded(
5757
child: Navigator(
58-
initialRoute: libraryModel.selectedPageId ?? PageIDs.searchPage,
58+
initialRoute: routingManager.selectedPageId ?? PageIDs.searchPage,
5959
onDidRemovePage: (page) {},
60-
key: libraryModel.masterNavigatorKey,
61-
observers: [libraryModel],
60+
key: routingManager.masterNavigatorKey,
61+
observers: [routingManager],
6262
onGenerateRoute: (settings) {
63-
final masterItems = createMasterItems();
63+
final masterItems = getAllMasterItems();
6464
final page = (masterItems.firstWhereOrNull(
6565
(e) => e.pageId == settings.name,
6666
) ??
@@ -69,6 +69,7 @@ class MasterDetailPage extends StatelessWidget {
6969

7070
return PageRouteBuilder(
7171
settings: settings,
72+
maintainState: PageIDs.permanent.contains(settings.name),
7273
pageBuilder: (_, __, ___) => BackGesture(child: page),
7374
transitionsBuilder: (_, a, __, c) =>
7475
FadeTransition(opacity: a, child: c),
File renamed without changes.

0 commit comments

Comments
 (0)