现阶段通知中心播放暂停切换功能已实现,但是上下一曲功能暂时消失,需要后续优化,这个commit是snapshot

This commit is contained in:
2026-08-21 22:58:44 +08:00
parent 94a4906671
commit 89c4ba8191
5 changed files with 201 additions and 156 deletions
+72
View File
@@ -0,0 +1,72 @@
// lib/audio/playback_state_manager.dart
import 'package:audio_service/audio_service.dart' as audio_service;
class PlaybackStateManager {
static final PlaybackStateManager _instance =
PlaybackStateManager._internal();
factory PlaybackStateManager() => _instance;
PlaybackStateManager._internal();
bool _playing = false;
bool get playing => _playing;
Duration _position = Duration.zero;
Duration get position => _position;
Duration _duration = Duration.zero;
Duration get duration => _duration;
// ⭐ 核心改动:使用 playPause 替代 play/pause 分离
audio_service.PlaybackState get playbackState {
// ⭐ 固定使用 playPause,不再动态切换
final playControl = audio_service.MediaControl(
androidIcon: _playing ? 'drawable/ic_pause' : 'drawable/ic_play',
label: _playing ? '暂停' : '播放',
action: audio_service.MediaAction.playPause, // 固定
);
final controls = [
audio_service.MediaControl(
androidIcon: 'drawable/ic_previous',
label: '上一曲',
action: audio_service.MediaAction.skipToPrevious,
),
playControl,
audio_service.MediaControl(
androidIcon: 'drawable/ic_next',
label: '下一曲',
action: audio_service.MediaAction.skipToNext,
),
];
return audio_service.PlaybackState(
controls: controls,
processingState: audio_service.AudioProcessingState.ready,
playing: _playing, // ⭐ 这里才是真正的播放状态,通知栏会根据它显示正确的图标
androidCompactActionIndices: const [0, 1, 2],
updateTime: DateTime.now(),
//extras: {'_refresh': DateTime.now().millisecondsSinceEpoch},
);
}
// ---- 状态更新方法保持不变 ----
void updatePlaying(bool playing) {
if (_playing != playing) {
_playing = playing;
}
}
void updatePosition(Duration position) {
_position = position;
}
void updateDuration(Duration duration) {
_duration = duration;
}
void reset() {
_playing = false;
_position = Duration.zero;
_duration = Duration.zero;
}
}
+33
View File
@@ -0,0 +1,33 @@
// lib/audio/player_controller.dart
import 'package:media_kit/media_kit.dart';
import '../services/playback_service.dart'; // ⭐ 修正路径
class PlayerController {
static final PlayerController _instance = PlayerController._internal();
factory PlayerController() => _instance;
PlayerController._internal();
final PlaybackService _playback = PlaybackService();
// ---- 状态流(只读) ----
Stream<bool> get playingStream => _playback.player.stream.playing;
Stream<Duration> get positionStream => _playback.player.stream.position;
Stream<Duration> get durationStream => _playback.player.stream.duration;
Stream<void> get completedStream => _playback.player.stream.completed;
// ---- 当前状态快照 ----
bool get isPlaying => _playback.player.state.playing;
Duration get position => _playback.player.state.position;
Duration get duration => _playback.player.state.duration;
// ---- 控制命令 ----
Future<void> play() => _playback.resume();
Future<void> pause() => _playback.pause();
Future<void> stop() => _playback.stop();
Future<void> seek(Duration position) => _playback.seek(position);
// ---- 加载歌曲 ----
void load(String url, {Map<String, String>? headers}) {
_playback.play(url, headers: headers);
}
}