Код: Выделить всё
@Composable
fun MediaPlayerController(
isMediaPlaying: Boolean,
onStart: () -> Unit,
onNext: () -> Unit
) {
Row() {
FloatingActionButton(
onClick = { onStart() },
) {
Icon(imageVector = if (isMediaPlaying) Icons.Filled.Pause else Icons.Filled.PlayArrow, contentDescription = null)
}
}
}
Код: Выделить всё
@Composable
fun BottomBarPlayer(
media: Media,
isMediaPlaying: Boolean,
onStart: () -> Unit,
onNext: () -> Unit,
) {
BottomAppBar(content = {
Column(
) {
Row(
) {
MediaPlayerController(
isMediaPlaying = isMediaPlaying,
onStart = onStart,
onNext = onNext
)
}
}
})
}
Код: Выделить всё
@Composable
fun App(
isMediaPlaying: Boolean,
mediaList: MutableList,
currentPlayingMedia: Media,
onItemClicked: (Int) -> Unit,
) {
Scaffold( bottomBar = {
BottomBarPlayer(media = currentPlayingMedia , isMediaPlaying =isMediaPlaying , onStart = onStart,onNext=onNext,navController=navController)
}
)
}
}
Код: Выделить всё
@Composable
fun Main() {
LMusicTheme {
Surface(
) {
App(
isMediaPlaying = viewModel.isPlaying,
currentPlayingMedia = viewModel.currentSelectedMedia,
onStart = {
viewModel.onUiEvents(UIEvents.PlayToggle)
},
}
}
}
Код: Выделить всё
fun onUiEvents(uiEvents: UIEvents) = viewModelScope.launch {
when(uiEvents){
UIEvents.SeekToNext ->mediaPlayerServiceHandle.onPlayerEvents(PlayerEvent.SeekToNext)
is UIEvents.PlayToggle -> {
mediaPlayerServiceHandle.onPlayerEvents(
PlayerEvent.PlayToggle
)
}
}
}
Код: Выделить всё
suspend fun onPlayerEvents(
playerEvent: PlayerEvent, selectedAudioIndex: Int = -1, seekPosition: Long = 0
) {
when (playerEvent) {
PlayerEvent.PlayToggle -> playToggle()
PlayerEvent.SelectMediaChange -> {
when (selectedAudioIndex) {
exoPlayer.currentMediaItemIndex -> {
if (exoPlayer.isPlaying){
_mediaState.value = MediaState.Playing(
isPlaying = false
)
playToggle()
}else{
_mediaState.value = MediaState.Playing(
isPlaying = true
)
playToggle()
}
}
else -> {
exoPlayer.seekToDefaultPosition(selectedAudioIndex)
_mediaState.value = MediaState.Playing(
isPlaying = true
)
exoPlayer.playWhenReady = true
startProgressUpdate()
}
}
}
}
}
}
Код: Выделить всё
private suspend fun playToggle() {
if (exoPlayer.isPlaying) {
exoPlayer.pause()
_mediaState.value = MediaState.CurrentPlaying(
exoPlayer.currentMediaItemIndex
)
_mediaState.value = MediaState.Playing(
isPlaying = false
) } else {
_mediaState.value = MediaState.Playing(
isPlaying = true
)
exoPlayer.play()
_mediaState.value = MediaState.CurrentPlaying(
exoPlayer.currentMediaItemIndex
)
}
}
Код: Выделить всё
var isPlaying by savedStateHandle.saveable { mutableStateOf(false) }
private val _uiState: MutableStateFlow = MutableStateFlow(UIState.Initial)
val uiState: StateFlow = _uiState.asStateFlow()
Код: Выделить всё
sealed class MediaState {
object Initial : MediaState()
data class Ready(val duration: Long) : MediaState()
data class Progress(val progress: Long) : MediaState()
data class Buffering(val progress: Long) : MediaState()
data class Playing(val isPlaying: Boolean) : MediaState()
data class CurrentPlaying(val mediaItemIndex: Int) : MediaState()
}
Я не знаю, как это изменилось, я нуд, пожалуйста, помогите мне, спасибо
я не могу публиковать больше кода, я пытаюсь удалить код, который кажется бесполезным для этого вопроса, если нужно, я опубликую, извините, я нуб
p>
Честно говоря, я хочу попробовать использовать currentRecomposeScope.invalidate(), но думаю, что это нехорошо, есть другие способы?
Подробнее здесь: https://stackoverflow.com/questions/787 ... -value-cha
Мобильная версия