NowPlayingScreen: von Scaffold/Route zu Overlay-Inhalt in HomeShell umgebaut

This commit is contained in:
Hermes (Server)
2026-08-29 14:45:41 +02:00
parent 96113a3e41
commit 9d0cb90a51
3 changed files with 182 additions and 157 deletions
+30 -30
View File
@@ -89,34 +89,30 @@ void main() {
metadataEdited: false,
);
// Öffnet den Vollbild-Player über denselben Weg wie in
// Startet die Wiedergabe über denselben Weg wie in
// song_list_navigation_test.dart (Tap auf eine SongZeile) — dieser Weg ist
// dort nachweislich unproblematisch, im Unterschied zu einem direkten
// Aufbau von NowPlayingScreen mit vorab befülltem MediaItem-Stream.
//
// Seit dem Umbau auf PlayerExpansionController (Plan
// 2026-08-29-blur-oeffnen-transition, Task 3) zeigt der Tap allein noch
// keine sichtbare Oberfläche — das Overlay-Rendering kommt erst mit
// Task 4/5 ("Bekannte Zwischenlücke", siehe Plan). Für die Prüfung von
// NowPlayingScreens eigenem Layout (Herz-Position) wird die Route hier
// deshalb zusätzlich, unabhängig vom Produktions-Pfad, direkt geöffnet.
// Sobald Task 5 NowPlayingScreen zu Overlay-Inhalt umbaut, muss dieser
// Test ohnehin überarbeitet werden (Task 5 durchsucht dafür selbst
// `test -iname "*now_playing*"`, was diese Datei einschließt).
// dort nachweislich unproblematisch und übt die echte SongZeile→MediaItem
// -Umwandlung. Seit dem Umbau auf PlayerExpansionController (Plan
// 2026-08-29-blur-oeffnen-transition, Task 3/5) ist NowPlayingScreen kein
// per Navigator.push geöffneter Screen mehr, sondern reiner Inhalt — hier
// deshalb direkt in einen eigenen Scaffold gepumpt (Task 5 Step 3), statt
// eine Route zu pushen. Der Handler behält den zuvor gestarteten Titel in
// seinem mediaItem-Stream, den NowPlayingScreen darüber sofort sieht.
Future<void> oeffnePlayer(WidgetTester tester) async {
final expansion = PlayerExpansionController(vsync: tester);
addTearDown(expansion.dispose);
final providers = [
Provider<MeloDb>.value(value: db),
Provider<MeloAudioHandler>.value(value: handler),
ChangeNotifierProvider<CategoryService>.value(value: kategorien),
ChangeNotifierProvider<PlaylistService>.value(value: playlists),
ChangeNotifierProvider<AppSettings>.value(value: einstellungen),
ChangeNotifierProvider<PlayerExpansionController>.value(
value: expansion),
];
await tester.pumpWidget(
MultiProvider(
providers: [
Provider<MeloDb>.value(value: db),
Provider<MeloAudioHandler>.value(value: handler),
ChangeNotifierProvider<CategoryService>.value(value: kategorien),
ChangeNotifierProvider<PlaylistService>.value(value: playlists),
ChangeNotifierProvider<AppSettings>.value(value: einstellungen),
ChangeNotifierProvider<PlayerExpansionController>.value(
value: expansion),
],
providers: providers,
child: MaterialApp(
home: Scaffold(
body: SongZeile(
@@ -133,8 +129,13 @@ void main() {
await tester.pumpAndSettle();
expect(expansion.progress, 1.0);
Navigator.of(tester.element(find.byType(SongZeile))).push(
MaterialPageRoute(builder: (_) => const NowPlayingScreen()),
await tester.pumpWidget(
MultiProvider(
providers: providers,
child: MaterialApp(
home: Scaffold(body: const NowPlayingScreen()),
),
),
);
await tester.pumpAndSettle();
}
@@ -154,12 +155,11 @@ void main() {
expect(find.byType(NowPlayingScreen), findsOneWidget);
// Nicht mehr in der AppBar:
final herzInAppBar = find.descendant(
of: find.byType(AppBar),
matching: find.byType(FavoriteButton),
);
expect(herzInAppBar, findsNothing);
// NowPlayingScreen ist seit dem Overlay-Umbau (Task 5) kein Scaffold/
// keine Route mehr und hat gar keine AppBar mehr — die frühere
// "nicht mehr in der AppBar"-Prüfung ist jetzt trivial durch den Umbau
// selbst erfüllt.
expect(find.byType(AppBar), findsNothing);
// Aber sichtbar auf dem Bildschirm, in derselben Row wie der Titel.
final titelRow = find