import 'package:flutter/services.dart'; class MusicService { static final MusicService _instance = MusicService._internal(); /// 获取单例 factory MusicService() => _instance; // 方法通道 final MethodChannel _methodChannel = const MethodChannel( 'com.yunqiinnovation.music_service', ); // 事件通道 - 简化为只使用数据和状态通道 late final EventChannel _dataEventChannel; late final EventChannel _statusEventChannel; // 事件流 late final Stream _dataStream; late final Stream _statusStream; // 获取事件流 Stream get onDataReceived => _dataStream; // 状态流直接传递原始数据 Stream get onStatusUpdated => _statusStream; // 内部构造函数 MusicService._internal() { _dataEventChannel = const EventChannel( 'com.yunqiinnovation.music_service/data_events', ); _statusEventChannel = const EventChannel( 'com.yunqiinnovation.music_service/status_events', ); // 初始化事件流 _dataStream = _dataEventChannel.receiveBroadcastStream(); _statusStream = _statusEventChannel.receiveBroadcastStream(); } Future playMusic(Map song) async { await _methodChannel.invokeMethod('play', {'song': song}); } Future pauseMusic() async => _methodChannel.invokeMethod('pause'); Future resumeMusic() async => _methodChannel.invokeMethod('resume'); Future nextTrack() async => _methodChannel.invokeMethod('next'); Future previousTrack() async => _methodChannel.invokeMethod('previous'); Future stopMusic() async => _methodChannel.invokeMethod('stop'); Future setVolume(double volume) async => _methodChannel.invokeMethod( 'setVolume', {'volume': volume}, ); // volume: 0.0~1.0 Future> getStatus() async { final result = await _methodChannel.invokeMethod('getStatus'); return { 'isPlaying': result?['isPlaying'] ?? false, 'url': result?['url'] ?? "", }; } /// 获取播放进度信息 Future> getProgress() async { final result = await _methodChannel.invokeMethod('getProgress'); return { 'currentPosition': result?['currentPosition'] ?? 0, // 当前播放位置(毫秒) 'duration': result?['duration'] ?? 0, // 总时长(毫秒) 'progress': result?['progress'] ?? 0.0, // 播放进度(0.0-1.0) }; } /// 跳转到指定位置 Future seekTo(int positionMs) async { await _methodChannel.invokeMethod('seekTo', {'position': positionMs}); } }