@@ -19,52 +19,65 @@ package com.google.maps.android.compose
1919import android.view.View
2020import android.view.ViewGroup
2121import androidx.compose.runtime.Composable
22- import androidx.compose.runtime.CompositionContext
22+ import androidx.compose.runtime.DisposableEffect
23+ import androidx.compose.runtime.LaunchedEffect
2324import androidx.compose.runtime.getValue
25+ import androidx.compose.runtime.mutableStateOf
2426import androidx.compose.runtime.remember
2527import androidx.compose.runtime.rememberCompositionContext
2628import androidx.compose.runtime.rememberUpdatedState
29+ import androidx.compose.runtime.setValue
2730import androidx.compose.ui.platform.ComposeView
2831import androidx.compose.ui.platform.LocalView
2932import androidx.core.graphics.applyCanvas
33+ import androidx.core.graphics.createBitmap
3034import com.google.android.gms.maps.model.BitmapDescriptor
3135import com.google.android.gms.maps.model.BitmapDescriptorFactory
32- import androidx.core.graphics.createBitmap
36+ import kotlinx.coroutines.Dispatchers
37+ import kotlinx.coroutines.withContext
3338
3439@MapsComposeExperimentalApi
3540@Composable
3641public fun rememberComposeBitmapDescriptor (
3742 vararg keys : Any ,
3843 content : @Composable () -> Unit ,
39- ): BitmapDescriptor {
44+ ): BitmapDescriptor ? {
45+ var bitmapDescriptor by remember { mutableStateOf<BitmapDescriptor ?>(null ) }
4046 val parent = LocalView .current as ViewGroup
4147 val compositionContext = rememberCompositionContext()
4248 val currentContent by rememberUpdatedState(content)
49+ val composeView = remember { ComposeView (parent.context) }
4350
44- return remember(parent, compositionContext, currentContent, * keys) {
45- renderComposableToBitmapDescriptor(parent, compositionContext, currentContent)
46- }
47- }
48-
49- private val measureSpec = View .MeasureSpec .makeMeasureSpec(0 , View .MeasureSpec .UNSPECIFIED )
50-
51- private fun renderComposableToBitmapDescriptor (
52- parent : ViewGroup ,
53- compositionContext : CompositionContext ,
54- content : @Composable () -> Unit ,
55- ): BitmapDescriptor {
56- val composeView =
57- ComposeView (parent.context)
51+ DisposableEffect (Unit ) {
52+ composeView
5853 .apply {
5954 layoutParams = ViewGroup .LayoutParams (
6055 ViewGroup .LayoutParams .WRAP_CONTENT ,
6156 ViewGroup .LayoutParams .WRAP_CONTENT ,
6257 )
6358 setParentCompositionContext(compositionContext)
64- setContent(content )
59+ setContent(currentContent )
6560 }
6661 .also (parent::addView)
62+ onDispose {
63+ parent.removeView(composeView)
64+ }
65+ }
66+
67+ LaunchedEffect (* keys) {
68+ bitmapDescriptor = withContext(Dispatchers .IO ) {
69+ renderComposableToBitmapDescriptor(composeView)
70+ }
71+ }
72+
73+ return bitmapDescriptor
74+ }
6775
76+ private val measureSpec = View .MeasureSpec .makeMeasureSpec(0 , View .MeasureSpec .UNSPECIFIED )
77+
78+ private fun renderComposableToBitmapDescriptor (
79+ composeView : ComposeView ,
80+ ): BitmapDescriptor {
6881 composeView.measure(measureSpec, measureSpec)
6982
7083 if (composeView.measuredWidth == 0 || composeView.measuredHeight == 0 ) {
@@ -79,7 +92,5 @@ private fun renderComposableToBitmapDescriptor(
7992
8093 bitmap.applyCanvas { composeView.draw(this ) }
8194
82- parent.removeView(composeView)
83-
8495 return BitmapDescriptorFactory .fromBitmap(bitmap)
8596}
0 commit comments