diff --git a/vico/compose/src/main/java/com/patrykandpatrick/vico/compose/cartesian/CartesianChartModelProducer.kt b/vico/compose/src/main/java/com/patrykandpatrick/vico/compose/cartesian/CartesianChartModelProducer.kt index 6b23832fe..0a74dcaa4 100644 --- a/vico/compose/src/main/java/com/patrykandpatrick/vico/compose/cartesian/CartesianChartModelProducer.kt +++ b/vico/compose/src/main/java/com/patrykandpatrick/vico/compose/cartesian/CartesianChartModelProducer.kt @@ -20,7 +20,7 @@ import androidx.compose.animation.core.AnimationSpec import androidx.compose.animation.core.animate import androidx.compose.animation.core.tween import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.State import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -46,8 +46,11 @@ import kotlin.coroutines.EmptyCoroutineContext import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.cancelAndJoin +import kotlinx.coroutines.currentCoroutineContext +import kotlinx.coroutines.job import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext internal val defaultCartesianDiffAnimationSpec: AnimationSpec = tween(durationMillis = Animation.DIFF_DURATION) @@ -164,9 +167,11 @@ private fun LaunchRegistration( if (isInPreview) { runBlocking(getCoroutineContext(isPreview = true)) { block() } } else { - DisposableEffect(chartID, animateIn) { - val disposable = block() - onDispose { disposable() } + LaunchedEffect(chartID, animateIn) { + withContext(getCoroutineContext(isPreview = false)) { + val disposable = block() + currentCoroutineContext().job.invokeOnCompletion { disposable() } + } } } } diff --git a/vico/multiplatform/src/commonMain/kotlin/com/patrykandpatrick/vico/multiplatform/cartesian/data/CartesianChartModel.kt b/vico/multiplatform/src/commonMain/kotlin/com/patrykandpatrick/vico/multiplatform/cartesian/data/CartesianChartModel.kt index 05232e1de..b56860834 100644 --- a/vico/multiplatform/src/commonMain/kotlin/com/patrykandpatrick/vico/multiplatform/cartesian/data/CartesianChartModel.kt +++ b/vico/multiplatform/src/commonMain/kotlin/com/patrykandpatrick/vico/multiplatform/cartesian/data/CartesianChartModel.kt @@ -22,7 +22,7 @@ import androidx.compose.animation.core.AnimationSpec import androidx.compose.animation.core.animate import androidx.compose.animation.core.tween import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.State import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -45,8 +45,11 @@ import kotlin.uuid.Uuid import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.cancelAndJoin +import kotlinx.coroutines.currentCoroutineContext +import kotlinx.coroutines.job import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext /** Stores a [CartesianChart]’s data. */ public class CartesianChartModel { @@ -231,9 +234,11 @@ private fun LaunchRegistration( if (isInPreview) { runBlocking(getCoroutineContext(isPreview = true)) { block() } } else { - DisposableEffect(chartID, animateIn) { - val disposable = block() - onDispose { disposable() } + LaunchedEffect(chartID, animateIn) { + withContext(getCoroutineContext(isPreview = false)) { + val disposable = block() + currentCoroutineContext().job.invokeOnCompletion { disposable() } + } } } }