@@ -21,6 +21,7 @@ import android.view.MotionEvent
2121import android.view.View
2222import android.view.ViewGroup
2323import androidx.compose.runtime.Composable
24+ import androidx.compose.runtime.MutableState
2425import androidx.compose.runtime.Stable
2526import androidx.compose.runtime.remember
2627import androidx.compose.ui.platform.LocalContext
@@ -92,6 +93,9 @@ public class BalloonState internal constructor(
9293 /* * The internal balloon window delegate. Set internally by the balloon modifier. */
9394 internal var _balloonWindow : BalloonWindow ? = null
9495
96+ /* * The balloon layout info state for triggering re-measurement. Set internally by the balloon modifier. */
97+ internal var _balloonLayoutInfo : MutableState <BalloonLayoutInfo ?>? = null
98+
9599 override val anchorView: View
96100 get() = _anchorView
97101 ? : error(" BalloonState is not attached to a composable. Use Modifier.balloon() to attach." )
@@ -318,9 +322,29 @@ public class BalloonState internal constructor(
318322 override fun getBalloonArrowView (): View =
319323 _balloonWindow ?.getBalloonArrowView() ? : error(" BalloonState is not attached" )
320324
325+ /* *
326+ * Triggers re-measurement of the balloon content.
327+ * Call this method when the balloon content changes dynamically (e.g., showing/hiding elements)
328+ * to update the balloon size without closing it.
329+ *
330+ * Example usage:
331+ * ```
332+ * var showExtra by remember { mutableStateOf(false) }
333+ *
334+ * Button(onClick = {
335+ * showExtra = !showExtra
336+ * balloonState.update() // Trigger re-measurement after content change
337+ * })
338+ * ```
339+ */
340+ public fun update () {
341+ _balloonLayoutInfo ?.value = null
342+ }
343+
321344 internal fun dispose () {
322345 _balloonWindow ?.dismiss()
323346 _balloonWindow = null
324347 _anchorView = null
348+ _balloonLayoutInfo = null
325349 }
326350}
0 commit comments