// lib/services/playback_service.dart import 'package:media_kit/media_kit.dart'; import 'package:flutter/foundation.dart'; class PlaybackService { static final PlaybackService _instance = PlaybackService._internal(); factory PlaybackService() => _instance; PlaybackService._internal() { // ⭐ 给单例本身打上 ID _serviceId = DateTime.now().microsecondsSinceEpoch.toString(); debugPrint('🎯 [PlaybackService] 单例创建, serviceId=$_serviceId'); } Player? _player; bool _initialized = false; late final String _serviceId; // ⭐ 服务实例 ID // ---------- Getter ---------- Player get player { debugPrint( '🎯 [PlaybackService] get player called, serviceId=$_serviceId, initialized=$_initialized, player=${_player?.hashCode}'); if (!_initialized) init(); return _player!; } bool get isInitialized => _initialized; // ---------- 初始化 ---------- void init() { if (_initialized) { debugPrint( '⚠️ [PlaybackService] init() 被重复调用, 跳过, serviceId=$_serviceId, player=${_player?.hashCode}'); return; } _player = Player(); _initialized = true; debugPrint( '✅ [PlaybackService] Player 已创建, serviceId=$_serviceId, player=${_player.hashCode}'); } // ---------- 播放 ---------- Future play(String url, {Map? headers}) async { debugPrint( '▶️ [PlaybackService] play() called, serviceId=$_serviceId, player=${_player?.hashCode}'); if (!_initialized) init(); final media = (headers != null && headers.isNotEmpty) ? Media(url, httpHeaders: headers) : Media(url); await _player!.open(media); await _player!.play(); } // ---------- 控制 ---------- Future pause() async { debugPrint( '⏸️ [PlaybackService] pause() called, serviceId=$_serviceId, player=${_player?.hashCode}'); if (_initialized && _player != null) { await _player!.pause(); } } Future resume() async { debugPrint( '▶️ [PlaybackService] resume() called, serviceId=$_serviceId, player=${_player?.hashCode}'); if (_initialized && _player != null) { await _player!.play(); } } Future stop() async { debugPrint( '⏹️ [PlaybackService] stop() called, serviceId=$_serviceId, player=${_player?.hashCode}'); if (_initialized && _player != null) { await _player!.stop(); } } Future seek(Duration position) async { debugPrint( '⏩ [PlaybackService] seek() called, serviceId=$_serviceId, player=${_player?.hashCode}'); if (_initialized && _player != null) { await _player!.seek(position); } } void setVolume(double volume) { if (_initialized && _player != null) { _player!.setVolume(volume); } } // ---------- 释放 ---------- void dispose() { debugPrint( '🗑️ [PlaybackService] dispose() called, serviceId=$_serviceId, player=${_player?.hashCode}'); if (_initialized && _player != null) { _player!.dispose(); _player = null; _initialized = false; } } // ---------- 重新初始化 ---------- void reinitialize() { debugPrint( '🔄 [PlaybackService] reinitialize() called, serviceId=$_serviceId'); dispose(); init(); } }