vico: java.lang.NullPointerException: Attempt to invoke interface method 'float com.patrykandpatrick.vico.core.entry.ChartEntry.getX()' on a null object reference

Describe the bug Version: 1.9.2 (Unable to try newer versions due to #407)

Usage:

    private val producer = ChartEntryModelProducer()

LaunchedEffect(key1 = Unit) {
    while (true) {
        producer.setEntries(viewModel.dataList)
        delay(500)
    }
}
VicoChart(producer = producer)
@Composable
    fun VicoChart(producer: ChartEntryModelProducer) {
        Chart(
            chart = lineChart(),
            chartModelProducer = producer,
            startAxis = rememberStartAxis(),
            bottomAxis = rememberBottomAxis(),
            diffAnimationSpec = snap()
        ) {
            3F
        }
    }

The dataList is being updated by a flow collector:

f.collect { data ->
    viewModel.dataList.add(FloatEntry(data.t.toFloat()/256F,data.t.toFloat()))
    while (viewModel.dataList.size> BUFFER_SIZE) viewModel.dataList.removeFirst()
}

This issue is not occurring immediately, but after around 10-15s. BUFFER_SIZE=3840 The issue occurs after ~7k data points.

java.lang.NullPointerException: Attempt to invoke interface method 'float com.patrykandpatrick.vico.core.entry.ChartEntry.getX()' on a null object reference
	at com.patrykandpatrick.vico.core.entry.diff.DefaultDiffProcessor.updateProgressMap(DefaultDiffProcessor.kt:101)
	at com.patrykandpatrick.vico.core.entry.diff.DefaultDiffProcessor.setEntries(DefaultDiffProcessor.kt:47)
	at com.patrykandpatrick.vico.core.entry.ChartEntryModelProducer.setEntries$lambda$1$lambda$0(ChartEntryModelProducer.kt:77)
	at com.patrykandpatrick.vico.core.entry.ChartEntryModelProducer.$r8$lambda$DLLZQwVnv6C3LZjvqE_A2NZ0Tws(Unknown Source:0)
	at com.patrykandpatrick.vico.core.entry.ChartEntryModelProducer$$ExternalSyntheticLambda1.run(Unknown Source:8)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
	at java.lang.Thread.run(Thread.java:1012)

Module

  • compose
  • views
  • compose-m2
  • compose-m3
  • core (select if none of the above apply)

To reproduce Unsure, try rendering a timeseries data and trim it from the end to a fixed length. Render it every 500ms.

Expected behavior No error

Screenshots N/A

Android versions 13

Additional context N/A

About this issue

  • Original URL
  • State: closed
  • Created 9 months ago
  • Comments: 27 (13 by maintainers)

Most upvoted comments

Sounds good. Vico 1.13.0 Alpha 5, which resolves the flickering issue, is now rolling out. I enclose a screen recording.

https://github.com/patrykandpatrick/vico/assets/120058021/d712bb25-c5cb-422c-9304-d60878e0b0c9

Since ChartEntryModelProducer is at fault here, you could use the Chart overload that accepts a ChartEntryModel. You can create ChartEntryModels via entryModelOf:

entryModelOf(viewModel.data)

Vico 1.13.0 Alpha 3 comes out today. The ETA for version 1.13.0 Alpha 4 is tomorrow or the day after.