vico icon indicating copy to clipboard operation
vico copied to clipboard

Crash in BrushShader.createShader

Open ber4444 opened this issue 4 months ago • 4 comments

How to reproduce

occasionally happening due to Compose not guaranteeing a non-null Shader for a Paint: https://developer.android.com/reference/kotlin/androidx/compose/ui/graphics/Paint#shader()

Observed behavior

java.lang.IllegalArgumentException: Required value was null.
	at com.patrykandpatrick.vico.compose.component.shape.shader.BrushShader.createShader(BrushShader.kt:54)
	at com.patrykandpatrick.vico.core.component.shape.shader.CacheableDynamicShader.provideShader(CacheableDynamicShader.kt:37)
	at com.patrykandpatrick.vico.core.component.shape.ShapeComponent.applyShader(ShapeComponent.kt:133)
	at com.patrykandpatrick.vico.core.component.shape.ShapeComponent.draw(ShapeComponent.kt:93)
	at com.patrykandpatrick.vico.core.component.shape.LineComponent.drawVertical(LineComponent.kt:103)
	at com.patrykandpatrick.vico.core.chart.column.ColumnChart.drawChartInternal(ColumnChart.kt:208)
	at com.patrykandpatrick.vico.core.chart.column.ColumnChart.drawChart(ColumnChart.kt:131)
	at com.patrykandpatrick.vico.core.chart.BaseChart.drawChartInternal(BaseChart.kt:134)
	at com.patrykandpatrick.vico.core.chart.BaseChart.drawScrollableContent(BaseChart.kt:92)
	at com.patrykandpatrick.vico.core.chart.BaseChart.drawScrollableContent(BaseChart.kt:37)
	at com.patrykandpatrick.vico.core.chart.composed.ComposedChart.drawChart(ComposedChart.kt:90)
	at com.patrykandpatrick.vico.core.chart.composed.ComposedChart.drawChartInternal(ComposedChart.kt:98)
	at com.patrykandpatrick.vico.core.chart.composed.ComposedChart.drawChartInternal(ComposedChart.kt:45)
	at com.patrykandpatrick.vico.core.chart.BaseChart.drawScrollableContent(BaseChart.kt:92)
	at com.patrykandpatrick.vico.core.chart.BaseChart.drawScrollableContent(BaseChart.kt:37)
	at com.patrykandpatrick.vico.compose.chart.ChartsKt.ChartImpl$lambda$25(Charts.kt:380)
	at com.patrykandpatrick.vico.compose.chart.ChartsKt.$r8$lambda$XvvHE2sGn3N4v97MHtOgnrcUo68(Unknown Source:0)
	at com.patrykandpatrick.vico.compose.chart.ChartsKt$$ExternalSyntheticLambda4.invoke(D8$$SyntheticClass:0)
	at androidx.compose.ui.draw.DrawBackgroundModifier.draw(DrawModifier.kt:127)
	at androidx.compose.ui.node.LayoutNodeDrawScope.drawDirect-eZhPAX0$ui_release(LayoutNodeDrawScope.kt:110)
	at androidx.compose.ui.node.LayoutNodeDrawScope.draw-eZhPAX0$ui_release(LayoutNodeDrawScope.kt:89)
	at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:450)
	at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:439)
	at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:280)
	at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:447)
	at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:439)
	at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:280)
	at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:447)
	at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:439)
	at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.kt:1000)
	at androidx.compose.ui.node.InnerNodeCoordinator.performDraw(InnerNodeCoordinator.kt:196)
	at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:447)
	at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:439)
	at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:280)
	at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:447)
	at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:439)
	at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:280)
	at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:447)
	at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:439)
	at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.kt:1000)
	at androidx.compose.ui.node.InnerNodeCoordinator.performDraw(InnerNodeCoordinator.kt:196)
	at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:447)
	at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:439)
	at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:280)
	at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:447)
	at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:439)
	at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:280)
	at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:447)
	at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:439)
	at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.kt:1000)
	at androidx.compose.ui.node.InnerNodeCoordinator.performDraw(InnerNodeCoordinator.kt:196)
	at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:447)
	at androidx.compose.ui.node.NodeCoordinator.access$drawContainedDrawModifiers(NodeCoordinator.kt:58)
	at androidx.compose.ui.node.NodeCoordinator$drawBlock$1$1.invoke(NodeCoordinator.kt:469)
	at androidx.compose.ui.node.NodeCoordinator$drawBlock$1$1.invoke(NodeCoordinator.kt:468)
	at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2441)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:502)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:258)
	at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:133)
	at androidx.compose.ui.node.NodeCoordinator$drawBlock$1.invoke(NodeCoordinator.kt:468)
	at androidx.compose.ui.node.NodeCoordinator$drawBlock$1.invoke(NodeCoordinator.kt:466)
	at androidx.compose.ui.platform.GraphicsLayerOwnerLayer$recordLambda$1.invoke(GraphicsLayerOwnerLayer.android.kt:291)
	at androidx.compose.ui.platform.GraphicsLayerOwnerLayer$recordLambda$1.invoke(GraphicsLayerOwnerLayer.android.kt:289)
	at androidx.compose.ui.graphics.layer.GraphicsLayerV29.record(GraphicsLayerV29.android.kt:245)
	at androidx.compose.ui.graphics.layer.GraphicsLayer.recordInternal(AndroidGraphicsLayer.android.kt:430)
	at androidx.compose.ui.graphics.layer.GraphicsLayer.record-mL-hObY(AndroidGraphicsLayer.android.kt:423)
	at androidx.compose.ui.platform.GraphicsLayerOwnerLayer.updateDisplayList(GraphicsLayerOwnerLayer.android.kt:284)
	at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:1573)
	at android.view.View.draw(View.java:25197)
	at android.view.View.updateDisplayListIfDirty(View.java:24053)
	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4788)
	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4760)
	at android.view.View.updateDisplayListIfDirty(View.java:23999)
	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4788)
	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4760)
	at android.view.View.updateDisplayListIfDirty(View.java:23999)
	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4788)
	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4760)
	at android.view.View.updateDisplayListIfDirty(View.java:23999)
	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4788)
	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4760)
	at android.view.View.updateDisplayListIfDirty(View.java:23999)
	at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:768)
	at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:774)
	at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:872)
	at android.view.ViewRootImpl.draw(ViewRootImpl.java:6121)
	at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:5776)
	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:4858)
	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:3345)
	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:11437)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1690)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1699)
	at android.view.Choreographer.doCallbacks(Choreographer.java:1154)
	at android.view.Choreographer.doFrame(Choreographer.java:1080)
	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1647)
	at android.os.Handler.handleCallback(Handler.java:958)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loopOnce(Looper.java:230)
	at android.os.Looper.loop(Looper.java:319)
	at android.app.ActivityThread.main(ActivityThread.java:9063)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:588)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)

Expected behavior

no crash

Vico version(s)

1.15.0

Android version(s)

14

Additional information

in your sdk,

val tempPaint = Paint()
        ...
        return requireNotNull(tempPaint.shader).apply {

should be replaced with tempPaint.shader?.let

ber4444 avatar Oct 08 '24 20:10 ber4444