import 'package:meta/meta.dart'; import 'package:mobx/mobx.dart'; import '../../domain/entities/playback_state.dart'; import '../../domain/entities/song.dart'; import '../../domain/repositories/audio_repository.dart'; import '../../domain/repositories/music_data_repository.dart'; part 'audio_store.g.dart'; class AudioStore extends _AudioStore with _$AudioStore { AudioStore( {@required MusicDataRepository musicDataRepository, @required AudioRepository audioRepository}) : super(musicDataRepository, audioRepository); } abstract class _AudioStore with Store { _AudioStore(this._musicDataRepository, this._audioRepository); final MusicDataRepository _musicDataRepository; final AudioRepository _audioRepository; bool _initialized = false; final List _disposers = []; @observable ObservableStream currentSong; @observable Song song; @observable ObservableStream playbackStateStream; @observable ObservableStream currentPositionStream; @action Future init() async { if (!_initialized) { print('AudioStore.init'); currentSong = _audioRepository.currentSongStream.asObservable(); currentPositionStream = _audioRepository.currentPositionStream.asObservable(initialValue: 0); _disposers.add(autorun((_) { updateSong(currentSong.value); })); playbackStateStream = _audioRepository.playbackStateStream.asObservable(); _initialized = true; } } void dispose() { print('AudioStore.dispose'); _disposers.forEach((d) => d()); } @action Future playSong(int index, List songList) async { _audioRepository.playSong(index, songList); } @action Future play() async { _audioRepository.play(); } @action Future pause() async { _audioRepository.pause(); } @action Future updateSong(Song streamValue) async { print('updateSong'); if (streamValue != null && streamValue != song) { print('actually updating...'); song = streamValue; } } }