vico
vico copied to clipboard
Crash in BrushShader.createShader
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