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'; part 'audio_store.g.dart'; class AudioStore extends _AudioStore with _$AudioStore { AudioStore({@required AudioRepository audioRepository}) : super(audioRepository); } abstract class _AudioStore with Store { _AudioStore(this._audioRepository); final AudioRepository _audioRepository; bool _initialized = false; final List _disposers = []; @observable ObservableStream currentSong; @observable Song song; @observable ObservableStream playbackStateStream; @observable ObservableStream currentPositionStream; @observable ObservableStream> queueStream; @observable ObservableStream queueIndexStream; @action void init() { if (!_initialized) { print('AudioStore.init'); currentSong = _audioRepository.currentSongStream.asObservable(); currentPositionStream = _audioRepository.currentPositionStream.asObservable(initialValue: 0); queueStream = _audioRepository.queueStream.asObservable(initialValue: []); queueIndexStream = _audioRepository.queueIndexStream.asObservable(); _disposers.add(autorun((_) { updateSong(currentSong.value); })); playbackStateStream = _audioRepository.playbackStateStream.asObservable(); _initialized = true; } } void dispose() { print('AudioStore.dispose'); for (final ReactionDisposer d in _disposers) { 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 skipToNext() async { _audioRepository.skipToNext(); } @action Future skipToPrevious() async { _audioRepository.skipToPrevious(); } @action Future updateSong(Song streamValue) async { print('updateSong'); if (streamValue != null && streamValue != song) { print('actually updating...'); song = streamValue; } } }