Vollbild-Player: Schließgeste live an progress gekoppelt, symmetrisch zum Öffnen
This commit is contained in:
@@ -15,6 +15,7 @@ import '../shared/theme.dart';
|
||||
import 'audio_handler.dart';
|
||||
import 'cover_farbe.dart';
|
||||
import 'lrc.dart';
|
||||
import 'player_expansion_controller.dart';
|
||||
import 'queue_screen.dart';
|
||||
|
||||
/// Inhalt des Vollbild-Players — wird von HomeShell in ein per progress
|
||||
@@ -49,8 +50,7 @@ class NowPlayingScreen extends StatelessWidget {
|
||||
children: [
|
||||
_VollbildLeiste(handler: handler, onLyrics: _showLyrics),
|
||||
Expanded(
|
||||
child: GestureDetector(
|
||||
onVerticalDragStart: (_) {}, // s. Task 8
|
||||
child: _SchliessGeste(
|
||||
child: StreamBuilder<MediaItem?>(
|
||||
stream: handler.mediaItem,
|
||||
builder: (context, snapshot) {
|
||||
@@ -153,6 +153,44 @@ class WanderndesCover extends StatelessWidget {
|
||||
}
|
||||
}
|
||||
|
||||
/// Schließt den Vollbild-Player per Wischgeste nach unten — symmetrisch zum
|
||||
/// Öffnen am Mini-Player, live über denselben PlayerExpansionController.
|
||||
/// Eigenes StatefulWidget, weil eine lokale Rohstrecke über die Gestendauer
|
||||
/// mitgeführt werden muss (analog zum bisherigen `_versatz`-Muster in
|
||||
/// mini_player.dart).
|
||||
class _SchliessGeste extends StatefulWidget {
|
||||
const _SchliessGeste({required this.child});
|
||||
final Widget child;
|
||||
|
||||
@override
|
||||
State<_SchliessGeste> createState() => _SchliessGesteState();
|
||||
}
|
||||
|
||||
class _SchliessGesteState extends State<_SchliessGeste> {
|
||||
double _strecke = 0;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final controller = context.read<PlayerExpansionController>();
|
||||
return GestureDetector(
|
||||
// Ohne opaque behavior fängt die Geste keine Berührungen über den
|
||||
// großflächigen, unbemalten Bereichen des Inhalts ab (z.B. über dem
|
||||
// Cover-Platzhalter, der nur ein leeres SizedBox ist) — GestureDetector
|
||||
// reagiert per Default (deferToChild) nur dort, wo ein Nachfahre
|
||||
// tatsächlich etwas zeichnet (per Testlauf verifiziert).
|
||||
behavior: HitTestBehavior.opaque,
|
||||
onVerticalDragStart: (_) => _strecke = 0,
|
||||
onVerticalDragUpdate: (details) {
|
||||
_strecke += details.delta.dy;
|
||||
controller.dragBy(details.delta.dy);
|
||||
},
|
||||
onVerticalDragEnd: (details) => controller.dragEnd(
|
||||
context, _strecke, details.velocity.pixelsPerSecond.dy),
|
||||
child: widget.child,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// Die bisherigen AppBar-Actions (Songtext, Sleep-Timer, Warteschlange) als
|
||||
/// eigene Kopfzeile statt echter AppBar — eine Route/Scaffold gibt es hier
|
||||
/// nicht mehr.
|
||||
|
||||
Reference in New Issue
Block a user