patrykandpatrick / vico

A light and extensible chart library for Android.
https://patrykandpatrick.com/vico/wiki
Apache License 2.0
2.08k stars 125 forks source link

Collection contains no element matching the predicate #607

Closed kafri8889 closed 6 months ago

kafri8889 commented 6 months ago

How to reproduce

I don't know how to reproduce, I just added the folowing code to update chart

// in view model
modelProducer.runTransaction {
    lineSeries { series(y) }
        // updateExtras { it[lineChartXLabelKey] = xLabel }
}.await()

y value => [175.0, 0.0, 0.0, 0.0, 175.0, 775.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 400.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 550.0]

in chart screen

                        val marker = rememberMarker()
            val chart = rememberCartesianChart(
                rememberLineCartesianLayer(
                    listOf(
                        rememberLineSpec(
                            DynamicShaders.color(MaterialTheme.colorScheme.primary)
                        )
                    )
                ),
                persistentMarkers = mapOf(7f to marker),
                startAxis = rememberStartAxis(),
                bottomAxis = rememberBottomAxis(
                    guideline = null,
                    valueFormatter = { x, chartValues, _ ->
//                      chartValues.model.extraStore[ChartViewModel.lineChartXLabelKey][x.toInt()]
                        x.toString()
                    }
                ),
            )

            Card(
                shape = MaterialTheme.shapes.medium,
                colors = CardDefaults.cardColors(
                    containerColor = MaterialTheme.colorScheme.tertiaryContainer.copy(alpha = 0.24f)
                ),
                modifier = Modifier
                    .padding(horizontal = 8.dp)
            ) {
                CartesianChartHost(
                    chart = chart,
                    modelProducer = modelProducer,
                    marker = marker,
                    horizontalLayout = HorizontalLayout.fullWidth(),
                    modifier = Modifier
                        .padding(8.dp)
                        .fillMaxWidth()
                        .heightIn(min = 256.dp)
                )
            }

Observed behavior

Error:

FATAL EXCEPTION: main
                                                   Process: com.anafthdev.driminder, PID: 15618
                                                   java.util.NoSuchElementException: Collection contains no element matching the predicate.
                                                    at com.patrykandpatrick.vico.core.axis.vertical.DefaultVerticalAxisItemPlacer$Mode$Step.getPartialLabelValues(DefaultVerticalAxisItemPlacer.kt:280)
                                                    at com.patrykandpatrick.vico.core.axis.vertical.DefaultVerticalAxisItemPlacer$Mode$Step.getPartialLabelValues$default(DefaultVerticalAxisItemPlacer.kt:126)
                                                    at com.patrykandpatrick.vico.core.axis.vertical.DefaultVerticalAxisItemPlacer$Mode$Step.getSimpleLabelValues(DefaultVerticalAxisItemPlacer.kt:154)
                                                    at com.patrykandpatrick.vico.core.axis.vertical.DefaultVerticalAxisItemPlacer$Mode$DefaultImpls.getLabelValues(DefaultVerticalAxisItemPlacer.kt:117)
                                                    at com.patrykandpatrick.vico.core.axis.vertical.DefaultVerticalAxisItemPlacer$Mode$Step.getLabelValues(DefaultVerticalAxisItemPlacer.kt:122)
                                                    at com.patrykandpatrick.vico.core.axis.vertical.DefaultVerticalAxisItemPlacer.getWidthMeasurementLabelValues(DefaultVerticalAxisItemPlacer.kt:51)
                                                    at com.patrykandpatrick.vico.core.axis.vertical.VerticalAxis.getMaxLabelWidth(VerticalAxis.kt:304)
                                                    at com.patrykandpatrick.vico.core.axis.vertical.VerticalAxis.getDesiredWidth(VerticalAxis.kt:276)
                                                    at com.patrykandpatrick.vico.core.axis.vertical.VerticalAxis.getHorizontalInsets(VerticalAxis.kt:225)
                                                    at com.patrykandpatrick.vico.core.layout.VirtualLayout.setBounds(VirtualLayout.kt:78)
                                                    at com.patrykandpatrick.vico.core.chart.CartesianChart.prepare(CartesianChart.kt:190)
                                                    at com.patrykandpatrick.vico.compose.chart.CartesianChartHostKt$CartesianChartHostImpl$6.invoke(CartesianChartHost.kt:250)
                                                    at com.patrykandpatrick.vico.compose.chart.CartesianChartHostKt$CartesianChartHostImpl$6.invoke(CartesianChartHost.kt:224)
                                                    at androidx.compose.ui.draw.DrawBackgroundModifier.draw(DrawModifier.kt:117)
                                                    at androidx.compose.ui.node.LayoutNodeDrawScope.drawDirect-x_KDEd0$ui_release(LayoutNodeDrawScope.kt:105)
                                                    at androidx.compose.ui.node.LayoutNodeDrawScope.draw-x_KDEd0$ui_release(LayoutNodeDrawScope.kt:86)
                                                    at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:376)
                                                    at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:365)
                                                    at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:265)
                                                    at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:373)
                                                    at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:365)
                                                    at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:265)
                                                    at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:373)
                                                    at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:365)
                                                    at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:265)
                                                    at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:373)
                                                    at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:365)
                                                    at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.kt:932)
                                                    at androidx.compose.ui.node.InnerNodeCoordinator.performDraw(InnerNodeCoordinator.kt:183)
                                                    at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:373)
                                                    at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:365)
                                                    at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:265)
                                                    at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:373)
                                                    at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:365)
                                                    at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:265)
                                                    at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:373)
                                                    at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:365)
19:45:20.530 AndroidRuntime   com....driminder  E   at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:265)
                                                    at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:373)
                                                    at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:365)
                                                    at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:265)
                                                    at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:373)
                                                    at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:365)
                                                    at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:265)
                                                    at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:373)
                                                    at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:365)
                                                    at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.kt:932)
                                                    at androidx.compose.ui.node.InnerNodeCoordinator.performDraw(InnerNodeCoordinator.kt:183)
                                                    at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:373)
                                                    at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:365)
                                                    at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.kt:932)
                                                    at androidx.compose.ui.node.InnerNodeCoordinator.performDraw(InnerNodeCoordinator.kt:183)
                                                    at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:373)
                                                    at androidx.compose.ui.node.NodeCoordinator.access$drawContainedDrawModifiers(NodeCoordinator.kt:56)
                                                    at androidx.compose.ui.node.NodeCoordinator$drawBlock$1$1.invoke(NodeCoordinator.kt:395)
                                                    at androidx.compose.ui.node.NodeCoordinator$drawBlock$1$1.invoke(NodeCoordinator.kt:394)
                                                    at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
                                                    at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:500)
                                                    at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
                                                    at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:133)
                                                    at androidx.compose.ui.node.NodeCoordinator$drawBlock$1.invoke(NodeCoordinator.kt:394)
                                                    at androidx.compose.ui.node.NodeCoordinator$drawBlock$1.invoke(NodeCoordinator.kt:392)
                                                    at androidx.compose.ui.platform.RenderNodeApi29.record(RenderNodeApi29.android.kt:209)
                                                    at androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList(RenderNodeLayer.android.kt:340)
                                                    at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:1449)
                                                    at android.view.View.draw(View.java:22782)
                                                    at android.view.View.updateDisplayListIfDirty(View.java:21587)
                                                    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4624)
                                                    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4597)
                                                    at android.view.View.updateDisplayListIfDirty(View.java:21537)
                                                    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4624)
                                                    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4597)
                                                    at android.view.View.updateDisplayListIfDirty(View.java:21537)
                                                    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4624)
                                                    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4597)
                                                    at android.view.View.updateDisplayListIfDirty(View.java:21537)
                                                    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4624)
                                                    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4597)
                                                    at android.view.View.updateDisplayListIfDirty(View.java:21537)
                                                    at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:559)
                                                    at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:565)
                                                    at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:642)
                                                    at android.view.ViewRootImpl.draw(ViewRootImpl.java:4664)
                                                    at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4375)
                                                    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3585)
19:45:20.530 AndroidRuntime   com....driminder  E   at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2340)
                                                    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9057)
                                                    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1040)
                                                    at android.view.Choreographer.doCallbacks(Choreographer.java:864)
                                                    at android.view.Choreographer.doFrame(Choreographer.java:791)
                                                    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1025)
                                                    at android.os.Handler.handleCallback(Handler.java:938)
                                                    at android.os.Handler.dispatchMessage(Handler.java:99)
                                                    at android.os.Looper.loop(Looper.java:255)
                                                    at android.app.ActivityThread.main(ActivityThread.java:8212)
                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632)
                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049)

Expected behavior

No excepion.

Vico version(s)

Latest unstable version

Android version(s)

11

Additional information

Lib version: 2.0.0-alpha.10

kafri8889 commented 6 months ago

oh, I found the problem, when the y value is greater than 100f, it will cause a crash with an error like above, why does this happen?

kafri8889 commented 6 months ago

Solved, I change itemPlacer from itemPlacer = remember { AxisItemPlacer.Vertical.step() } to itemPlacer = remember { AxisItemPlacer.Vertical.count() }

patrickmichalik commented 6 months ago

Hello! Thanks for the report. I’m glad that you’ve found a solution. That said, AxisItemPlacer.Vertical.auto shouldn’t cause such a crash—there seems to be a bug. We’ll look into it.

patrickmichalik commented 6 months ago

Vico 2.0.0 Alpha 11 fixes this. You should be able to switch back to AxisItemPlacer.Vertical.step, which tends to be preferable. Cheers!