Flutter type 'Future<List<dynamic>>' is not a subtype of type 'List<dynamic>' in type cast

Viewed 170

I got this error :

type 'Future<List>' is not a subtype of type 'List' in type cast

Unable to cast List from Future<List>

final List caMois = List.from(BddAMKGraphCA().getDataGraphCA('2021') as List).toList();

I used package mysql1 instead of PHP json to bind data : works, I can see the results

How can I fix this error ?

import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_charts/charts.dart';
import 'bdd_graph_annee.dart';
    
class SimpleBarChart extends StatelessWidget {
final String anneeCA;
    
SimpleBarChart({Key? key, required this.anneeCA}) : super(key: key);
    
final List<CaMoisData> caMois =
List<CaMoisData>.from(BddAMKGraphCA().getDataGraphCA('2021') as List).toList();
    
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: new AppBar(title: const Text('CA PAR MOIS')),
body: Center(
child: Container(
child: SfCartesianChart(
title: ChartTitle(text: 'CA DE 2021'),
//legend: Legend(isVisible: true),
series: <ChartSeries>[
BarSeries<CaMoisData, String>(
animationDuration: 1500,
dataSource: caMois,
xValueMapper: (CaMoisData monCa, _) => monCa.mois,
yValueMapper: (CaMoisData monCa, _) => monCa.ca,
dataLabelSettings: DataLabelSettings(isVisible: true)),
],
primaryXAxis: CategoryAxis(),
primaryYAxis: NumericAxis(
edgeLabelPlacement: EdgeLabelPlacement.shift,
//title: AxisTitle(text: 'CA DE 2021'),
)))));
}
}
    
import 'constant/bdd_constant.dart';
import 'package:mysql1/mysql1.dart';
    
// la classe de données
class CaMoisData {
final String mois;
final double ca;
CaMoisData(this.mois, this.ca); //, this.y2);
}
    
class BddAMKGraphCA {
Future<List<dynamic>> getDataGraphCA(String anneeCA) async {
final conn = await MySqlConnection.connect(ConnectionSettings(
host: ConstantBdd.host,
port: ConstantBdd.port,
user: ConstantBdd.user,
password: ConstantBdd.password,
db: ConstantBdd.db,
));
    
var sql = "SELECT ";
sql += "'Janv',replace(replace(format(ifnull(sum(case when DATE_FORMAT(cmd_date,'%m/%Y')='01/" +anneeCA +"' then cmd_ttc else 0 end),'0'), 2), ',',' '),'.',',') as 'tot_01',";
sql += "'Févr',replace(replace(format(ifnull(sum(case when DATE_FORMAT(cmd_date,'%m/%Y')='02/" +anneeCA +"' then cmd_ttc else 0 end),'0'), 2), ',',' '),'.',',') as 'tot_02',";
sql += "'Mars',replace(replace(format(ifnull(sum(case when DATE_FORMAT(cmd_date,'%m/%Y')='03/" +anneeCA +"' then cmd_ttc else 0 end),'0'), 2), ',',' '),'.',',') as 'tot_03',";
sql += "'Avril',replace(replace(format(ifnull(sum(case when DATE_FORMAT(cmd_date,'%m/%Y')='04/" +anneeCA +"' then cmd_ttc else 0 end),'0'), 2), ',',' '),'.',',') as 'tot_04',";
sql += "'Mai',replace(replace(format(ifnull(sum(case when DATE_FORMAT(cmd_date,'%m/%Y')='05/" +anneeCA +"' then cmd_ttc else 0 end),'0'), 2), ',',' '),'.',',') as 'tot_05',";
sql += "FROM cmde ";
sql += "WHERE cmd_date between '" +anneeCA +"-01-01' and '" +anneeCA +"-12-31' order by cmd_date desc";
var results = await conn.query(sql);
await conn.close();
//print(results.toList());
return results.toList();
}
}
4 Answers

That's because getDataGraphCA() returns a Future and means that the value is not immediately returned, you have to:

  1. wait (await keyword) for it and then setState() to update the ui,
  2. use a FutureBuilder in build method

you need to add await keyword before the Future call:

final List<CaMoisData> caMois =
List<CaMoisData>.from(BddAMKGraphCA().getDataGraphCA('2021') as List).toList();

Change this to

final List<CaMoisData> caMois = await
List<CaMoisData>.from(BddAMKGraphCA().getDataGraphCA('2021') as List).toList();

I found a solution : 1- Create a FutureBuilder Widget to bind results from Mysql

2- Create a function to bind data to List

final List<CaMoisData> caMois = [];

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("CA PAR MOIS"),
),
body: new Center(
child: FutureBuilder(
future: BddAMKGraphCA().getDataGraphCA('2021'),
builder: (context, AsyncSnapshot<List<dynamic>> snapshot) {
if (snapshot.hasData) {
return ListView.builder(
itemCount: snapshot.data!.length, // mettre le ! pour tester le null
itemBuilder: (context, int currentIndex) {insertData(snapshot.data);
return affGraphCA(context);
});
} else if (snapshot.hasError) {
return Text('${snapshot.error}');
}
//return  a circular progress indicator.
return new CircularProgressIndicator();
})));
}

insertData(dataCA) {
String moistemp; // = dataCA[0]['m01'].toString();
double catemp; //= double.parse(dataCA[0]['tot_01'].toString());

for (int i = 1; i < 13; i++) {
moistemp = dataCA[0]['m' + i.toString().padLeft(2, '0')].toString();
catemp = double.parse(
dataCA[0]['tot_' + i.toString().padLeft(2, '0')].toString());
caMois.add(CaMoisData(moistemp, catemp));
}
}

Widget affGraphCA(BuildContext context) {
return Container(
child: SfCartesianChart(
title: ChartTitle(text: 'CA DE 2021'),
//legend: Legend(isVisible: true),
series: <ChartSeries>[
BarSeries<CaMoisData, String>(
animationDuration: 1500,
dataSource: caMois,
xValueMapper: (CaMoisData monCa, _) => monCa.mois,
yValueMapper: (CaMoisData monCa, _) => monCa.ca,
dataLabelSettings: DataLabelSettings(isVisible: true)),
],
primaryXAxis: CategoryAxis(),
primaryYAxis: NumericAxis(
edgeLabelPlacement: EdgeLabelPlacement.shift,
//title: AxisTitle(text: 'CA DE 2021'),
)));
}
Related