Skip to content

[Crash] The width of the balloon must bigger than zero. #828

@zenyagami

Description

@zenyagami

Please complete the following information:

  • Library Version: latest 1.6.12
  • Affected Device(s) Several with android 12+

Describe the Bug:
I can't reproduce the issue, however I can see a crash, it was not before,

Fatal Exception: java.lang.IllegalArgumentException: The width of the balloon must bigger than zero.
       at com.skydoves.balloon.Balloon$Builder.setMeasuredWidth(Balloon.kt:2439)
       at com.skydoves.balloon.Balloon.updateSizeOfBalloonCard(Balloon.kt:1698)
       at com.skydoves.balloon.compose.BalloonComposeView.updateSizeOfBalloonCard-ozmzZPI$balloon_compose_release(BalloonComposeView.kt:315)
       at com.skydoves.balloon.compose.BalloonKt$Balloon$6.invoke$lambda$3$lambda$2(Balloon.kt:165)
       at androidx.compose.ui.layout.OnGloballyPositionedNode.onGloballyPositioned(OnGloballyPositionedModifier.kt:75)
       at androidx.compose.ui.node.LayoutNode.dispatchOnPositionedCallbacks$ui_release(LayoutNode.kt:1176)
       at androidx.compose.ui.node.OnPositionedDispatcher.dispatchHierarchy(OnPositionedDispatcher.kt:76)
       at androidx.compose.ui.node.OnPositionedDispatcher.dispatchHierarchy(OnPositionedDispatcher.kt:79)
       at androidx.compose.ui.node.OnPositionedDispatcher.dispatchHierarchy(OnPositionedDispatcher.kt:79)
       at androidx.compose.ui.node.OnPositionedDispatcher.dispatch(OnPositionedDispatcher.kt:67)
       at androidx.compose.ui.node.MeasureAndLayoutDelegate.dispatchOnPositionedCallbacks(MeasureAndLayoutDelegate.kt:719)
       at androidx.compose.ui.platform.AndroidComposeView.updatePositionCacheAndDispatch(AndroidComposeView.android.kt:1721)
       at androidx.compose.ui.platform.AndroidComposeView.onLayout(AndroidComposeView.android.kt:1687)
       at android.view.View.layout(View.java:25484)
       at android.view.ViewGroup.layout(ViewGroup.java:6441)
       at androidx.compose.ui.platform.AbstractComposeView.internalOnLayout$ui_release(ComposeView.android.kt:320)
       at androidx.compose.ui.window.PopupLayout.internalOnLayout$ui_release(AndroidPopup.android.kt:608)
       at androidx.compose.ui.platform.AbstractComposeView.onLayout(ComposeView.android.kt:310)
       at android.view.View.layout(View.java:25484)
       at android.view.ViewGroup.layout(ViewGroup.java:6441)
       at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:5214)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:4329)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:3155)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:10833)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1406)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1415)
       at android.view.Choreographer.doCallbacks(Choreographer.java:1015)
       at android.view.Choreographer.doFrame(Choreographer.java:945)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1389)
       at android.os.Handler.handleCallback(Handler.java:1001)
       at android.os.Handler.dispatchMessage(Handler.java:105)
       at android.os.Looper.loopOnce(Looper.java:268)
       at android.os.Looper.loop(Looper.java:384)
       at android.app.ActivityThread.main(ActivityThread.java:8921)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:907)
        

In crashlytics/sentry the same, I'm not sure which one is causing the conflict, But I suspect that this is the one:

@Composable
fun appDrawerBalloonFactory(): Balloon.Builder {
    val context = LocalContext.current

    return rememberBalloonBuilder {
        setArrowSize(14)
        setArrowOrientationRules(ArrowOrientationRules.ALIGN_ANCHOR)
        setArrowOrientation(ArrowOrientation.BOTTOM)
        setArrowPosition(0.15f)
        setWidth(BalloonSizeSpec.WRAP)
        setPadding(12)
        setCornerRadius(4f)
        setTextSize(17f)
        setBackgroundColor(context.getPrimaryContainerColor())
        setBalloonAnimation(BalloonAnimation.CIRCULAR)
        setPreferenceName(BalloonFactory.PREFERENCE_NAME_BALLOON_APP_DRAWER)
        setShowCounts(1)
        setBalloonHighlightAnimation(BalloonHighlightAnimation.SHAKE)
    }
}

Calling

      items.forEach {
                when (it) {
                    BottomBarItems.AppDrawer -> {
                        Balloon(
                            modifier = Modifier,
                            builder = appDrawerBalloonFactory(),
                            balloonContent = {
                                Text(
                                    text = stringResource(id = R.string.tool_tip_app_drawer),
                                    modifier = Modifier,
                                    style = MaterialTheme.typography.titleMedium,
                                    color = MaterialTheme.colorScheme.onPrimaryContainer
                                )
                            }
                        ) {
                            NavIcon(
                                icon = ImageVector.vectorResource(id = R.drawable.ic_apps),
                                onItemClick = onAppDrawerClicked
                            )
                            it.showAlignTop()
                        }
                    }

Add a clear description about the problem.

Expected Behavior:
to not crash.

A clear description of what you expected to happen.
I can't reproduce, since it seems that happens randomly but I can see several users with this issue tho,

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions