Skip to content

Commit df581e3

Browse files
committed
fix(sample): prevent player disposal on window resize and screen navigation
Hoist rememberVideoPlayerState() above BoxWithConstraints in App to prevent player state disposal when resizing crosses the 600dp breakpoint between RailLayout and BarLayout. Also add DisposableEffect to pause playback when leaving PlayerScreen and allow resuming when returning.
1 parent df55025 commit df581e3

2 files changed

Lines changed: 23 additions & 10 deletions

File tree

sample/composeApp/src/commonMain/kotlin/sample/app/App.kt

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import androidx.compose.runtime.setValue
2525
import androidx.compose.ui.Modifier
2626
import androidx.compose.ui.graphics.vector.ImageVector
2727
import androidx.compose.ui.unit.dp
28+
import io.github.kdroidfilter.composemediaplayer.VideoPlayerState
29+
import io.github.kdroidfilter.composemediaplayer.rememberVideoPlayerState
2830
import sample.app.feed.FeedScreen
2931
import sample.app.gallery.GalleryScreen
3032
import sample.app.player.PlayerScreen
@@ -40,22 +42,23 @@ private enum class Screen(val label: String, val icon: ImageVector) {
4042
fun App() {
4143
AppTheme {
4244
var currentScreen by remember { mutableStateOf(Screen.Player) }
45+
val playerState = rememberVideoPlayerState()
4346

4447
BoxWithConstraints(modifier = Modifier.fillMaxSize()) {
4548
val useRail = maxWidth >= 600.dp
4649

4750
if (useRail) {
48-
RailLayout(currentScreen, onScreenChange = { currentScreen = it })
51+
RailLayout(currentScreen, onScreenChange = { currentScreen = it }, playerState = playerState)
4952
} else {
50-
BarLayout(currentScreen, onScreenChange = { currentScreen = it })
53+
BarLayout(currentScreen, onScreenChange = { currentScreen = it }, playerState = playerState)
5154
}
5255
}
5356
}
5457
}
5558

5659
// Compact: bottom NavigationBar
5760
@Composable
58-
private fun BarLayout(current: Screen, onScreenChange: (Screen) -> Unit) {
61+
private fun BarLayout(current: Screen, onScreenChange: (Screen) -> Unit, playerState: VideoPlayerState) {
5962
Scaffold(
6063
bottomBar = {
6164
NavigationBar {
@@ -70,13 +73,13 @@ private fun BarLayout(current: Screen, onScreenChange: (Screen) -> Unit) {
7073
}
7174
},
7275
) { padding ->
73-
ScreenContent(current, Modifier.fillMaxSize().padding(padding))
76+
ScreenContent(current, Modifier.fillMaxSize().padding(padding), playerState)
7477
}
7578
}
7679

7780
// Medium+: side NavigationRail
7881
@Composable
79-
private fun RailLayout(current: Screen, onScreenChange: (Screen) -> Unit) {
82+
private fun RailLayout(current: Screen, onScreenChange: (Screen) -> Unit, playerState: VideoPlayerState) {
8083
Row(modifier = Modifier.fillMaxSize()) {
8184
NavigationRail {
8285
Spacer(Modifier.weight(1f))
@@ -90,14 +93,14 @@ private fun RailLayout(current: Screen, onScreenChange: (Screen) -> Unit) {
9093
}
9194
Spacer(Modifier.weight(1f))
9295
}
93-
ScreenContent(current, Modifier.weight(1f).fillMaxHeight())
96+
ScreenContent(current, Modifier.weight(1f).fillMaxHeight(), playerState)
9497
}
9598
}
9699

97100
@Composable
98-
private fun ScreenContent(screen: Screen, modifier: Modifier) {
101+
private fun ScreenContent(screen: Screen, modifier: Modifier, playerState: VideoPlayerState) {
99102
when (screen) {
100-
Screen.Player -> PlayerScreen(modifier)
103+
Screen.Player -> PlayerScreen(modifier, playerState)
101104
Screen.Gallery -> GalleryScreen(modifier)
102105
Screen.Feed -> FeedScreen(modifier)
103106
}

sample/composeApp/src/commonMain/kotlin/sample/app/player/PlayerScreen.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import androidx.compose.material3.Snackbar
4141
import androidx.compose.material3.Text
4242
import androidx.compose.material3.TextButton
4343
import androidx.compose.runtime.Composable
44+
import androidx.compose.runtime.DisposableEffect
4445
import androidx.compose.runtime.LaunchedEffect
4546
import androidx.compose.runtime.getValue
4647
import androidx.compose.runtime.mutableStateListOf
@@ -73,8 +74,17 @@ import kotlinx.coroutines.launch
7374

7475
@OptIn(ExperimentalMaterial3Api::class)
7576
@Composable
76-
fun PlayerScreen(modifier: Modifier = Modifier) {
77-
val playerState = rememberVideoPlayerState()
77+
fun PlayerScreen(modifier: Modifier = Modifier, playerState: VideoPlayerState = rememberVideoPlayerState()) {
78+
// Pause when leaving the screen, resume when coming back
79+
DisposableEffect(playerState) {
80+
val wasPlaying = playerState.isPlaying
81+
onDispose {
82+
if (playerState.isPlaying) {
83+
playerState.pause()
84+
}
85+
}
86+
}
87+
7888
val scope = rememberCoroutineScope()
7989

8090
var videoUrl by remember { mutableStateOf(SAMPLE_VIDEOS.first().second) }

0 commit comments

Comments
 (0)