1

I am trying to implement api data inside of chart_flutter time series. But i have a problem while implement it. Here is how my code look below:

class TankChart extends StatefulWidget {
  TankChart({Key key}) : super(key: key);
  @override
  _TankChartState createState() => _TankChartState();
}

class _TankChartState extends State<TankChart> {
  var ping;
List<charts.Series<TankPingProvider, dynamic>> series = [
        charts.Series(
          id: 'Tank Ping',
          data: ping,
          domainFn: (TankPingProvider pings, _) => pings.tankPing[number.toString()][index].trackedAt,
          measureFn: (TankPingProvider pings, _) => pings.tankPing[number.toString()][index].volume
        )
      ];

      return charts.TimeSeriesChart(
        series,
        animate: true,
      );
     
    });
  }
}

As you can see, i have error in this line of code:

data: ping,

and here:

series,

The error is:

The argument type 'TankPingProvider' can't be assigned to the parameter type 'List<TankPingProvider>'.

Is there anyway to implement the data?

Here is how my api look:

{
    "1": [
        {
            "tracked_at": "2020-11-29T17:33:42.000000Z",
            "fuel": 71.05,
            "level": 2.4867087,
            "volume": 41671.1
        },
        {
            "tracked_at": "2020-11-30T01:41:41.000000Z",
            "fuel": 70.04,
            "level": 2.451534,
            "volume": 41031.36
        },
        {
            "tracked_at": "2020-11-30T01:44:05.000000Z",
            "fuel": 68.47,
            "level": 2.396358,
            "volume": 40015.56
        },
        {
            "tracked_at": "2020-11-30T01:46:47.000000Z",
            "fuel": 66.89,
            "level": 2.341182,
            "volume": 38985.96
        },
]
}

And i use model instead of series. Here is how my model looks like:

import 'dart:convert';

Map<String, List<TankPing>> tankPingFromJson(dynamic str) => Map.from(json.decode(str)).map((k, v) => MapEntry<String, List<TankPing>>(k, List<TankPing>.from(v.map((x) => TankPing.fromJson(x)))));

String tankPingToJson(Map<String, List<TankPing>> data) => json.encode(Map.from(data).map((k, v) => MapEntry<String, dynamic>(k, List<dynamic>.from(v.map((x) => x.toJson())))));

class TankPing {
    TankPing({
        this.trackedAt,
        this.fuel,
        this.level,
        this.volume,
    });

    DateTime trackedAt;
    double fuel;
    double level;
    double volume;

    factory TankPing.fromJson(Map<String, dynamic> json) => TankPing(
        trackedAt: DateTime.parse(json["tracked_at"]),
        fuel: json["fuel"].toDouble(),
        level: json["level"].toDouble(),
        volume: json["volume"].toDouble(),
    );

    Map<String, dynamic> toJson() => {
        "tracked_at": trackedAt.toString(),
        "fuel": fuel,
        "level": level,
        "volume": volume,
    };
}

Any help would be appreciate.

1 Answer 1

1

The root of issue is the chart's datasource needs a List there while you put a Map in your code.

To fix it, convert all the items in the api result to a List< TankPingProvider> and it should work.

Sign up to request clarification or add additional context in comments.

8 Comments

Hey there, i have change the TankPingProvider as you said. But now, i have this error: "The argument type 'List<Series<TankPingProvider, dynamic>>' can't be assigned to the parameter type 'List<Series<dynamic, DateTime>>'" When i look at my code, i cannot find the 'DateTime'.
Because you are using a TimeSeriesChart, that requires exactly the Datetime type, not the dynamic one. Change the List<charts.Series<TankPingProvider, dynamic>> series to List<charts.Series<TankPingProvider, DateTime>> series.
alright, i have change it. But when you say change all the items in api to a List, do i have to change it from the model or just put an Empty List variable and then make it a list?
You can do anything comfortable for you. Since the chart requires a List as the input while the api response is a Map. So either the server alternates the response to a List directly or you take an extra step to convert the Map to List. Both will work in your case :)
Alright Thank You very much. I really appreciate your help :)
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.