wuxudong / react-native-charts-wrapper

a react native charts wrapper (support android & iOS)
2.43k stars 657 forks source link

Random crash with ScatterChart Android #910

Open virus2016 opened 1 year ago

virus2016 commented 1 year ago

*Do read files under `lib/` before reporting issues, you can find all the config there, all of them are straightforward.**

Expected Behavior

The app not to crash and chart to move where user wants it to go.

Actual Behavior

The app crashes randomly when it needs to redraw on moving the chart more than 1-3 times.

Screenshots

image

image

Data and config

java.lang.NegativeArraySizeException: -2 com.github.mikephil.charting.utils.Transformer.generateTransformedValuesScatter(Transformer.java:104) com.github.mikephil.charting.renderer.ScatterChartRenderer.drawValues(ScatterChartRenderer.java:116) com.github.mikephil.charting.charts.BarLineChartBase.onDraw(BarLineChartBase.java:278) android.view.View.draw(View.java:22350) android.view.View.updateDisplayListIfDirty(View.java:21226) android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500) android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473) android.view.View.updateDisplayListIfDirty(View.java:21186) android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500) android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473) android.view.View.updateDisplayListIfDirty(View.java:21186) android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500) android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473) android.view.View.updateDisplayListIfDirty(View.java:21186) android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500) android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473) android.view.View.updateDisplayListIfDirty(View.java:21186) android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500) android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473) android.view.View.updateDisplayListIfDirty(View.java:21186) android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500) android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473) android.view.View.updateDisplayListIfDirty(View.java:21186) android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500) android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473) android.view.View.updateDisplayListIfDirty(View.java:21186) android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500) android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473) android.view.View.updateDisplayListIfDirty(View.java:21186) android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500) android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473) android.view.View.updateDisplayListIfDirty(View.java:21186) android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500) android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473) android.view.View.updateDisplayListIfDirty(View.java:21186) android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500) android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473) android.view.View.updateDisplayListIfDirty(View.java:21186) android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500) android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473) android.view.View.updateDisplayListIfDirty(View.java:21186) android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:559) android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:565) android.view.ThreadedRenderer.draw(ThreadedRenderer.java:642) android.view.ViewRootImpl.draw(ViewRootImpl.java:4101) android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3828) android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3099) android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1952) android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8171) android.view.Choreographer$CallbackRecord.run(Choreographer.java:972) android.view.Choreographer.doCallbacks(Choreographer.java:796) android.view.Choreographer.doFrame(Choreographer.java:731) android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957) android.os.Handler.handleCallback(Handler.java:938) android.os.Handler.dispatchMessage(Handler.java:99) android.os.Looper.loop(Looper.java:223) android.app.ActivityThread.main(ActivityThread.java:7656) java.lang.reflect.Method.invoke(Native Method) com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

Steps to Reproduce the Problem

import { AntDesign } from "@expo/vector-icons";

import { NavigationContainer } from "@react-navigation/native";
import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";

import { ScatterChart } from "react-native-charts-wrapper";
function ChartScreen() {
  return (
    <View style={{ flex: 1 }}>
      <View style={{ flex: 1 }}>
        <ScatterChart
          // doubleTapToZoomEnabled={false}
          // animation={{ durationX: 1000, durationY: 1000 }}
          style={{ flex: 1 }}
          data={{
            dataSets: [
              {
                label: `Data Set ${Math.floor(Math.random() * 100 - 50)}`,
                values: [
                  { y: Math.random() * 100 - 50, x: Math.random() * 100 - 10 },
                  { y: Math.random() * 100 - 50, x: Math.random() * 100 - 10 },
                  { y: Math.random() * 100 - 50, x: Math.random() * 100 - 10 },
                ],
              },
            ],
          }}
        />
      </View>
    </View>
  );
}

function OfflineScreen() {
  return (
    <View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
      <Text>Offline POC</Text>
    </View>
  );
}

const Tab = createBottomTabNavigator();

export default function App() {
  return (
    <NavigationContainer>
      <Tab.Navigator>
        <Tab.Screen
          name="Chart POC"
          options={{
            tabBarIcon: ({ color, focused, size }) => (
              <AntDesign name="dotchart" size={size} color={color} />
            ),
          }}
          component={ChartScreen}
        />
        <Tab.Screen
          name="Offline POC"
          component={OfflineScreen}
          options={{ tabBarBadge: 3 }}
        />
      </Tab.Navigator>
    </NavigationContainer>
  );
}

Specifications

mMarcos208 commented 1 year ago

@virus2016 version 0.5.2? this version doesn't exist.

virus2016 commented 1 year ago

@virus2016 version 0.5.2? this version doesn't exist.

Hey @mMarcos208 - sorry 0.5.11 😉