简体   繁体   中英

type 'double' is not a subtype of type 'int?' null problem on api call flutter

I use this json to list stocks(BIST). https://bigpara.hurriyet.com.tr/api/v1/hisse/list This is my model:

 // To parse this JSON data, do // // final bigParaList = bigParaListFromJson(jsonString); import 'dart:convert'; BigParaList bigParaListFromJson(String str) => BigParaList.fromJson(json.decode(str)); String bigParaListToJson(BigParaList data) => json.encode(data.toJson()); class BigParaList { BigParaList({ required this.code, required this.data, }); String code; List<Datum> data; factory BigParaList.fromJson(Map<String, dynamic> json) => BigParaList( code: json["code"], data: List<Datum>.from(json["data"].map((x) => Datum.fromJson(x))), ); Map<String, dynamic> toJson() => { "code": code, "data": List<dynamic>.from(data.map((x) => x.toJson())), }; } class Datum { Datum({ required this.id, required this.kod, required this.ad, required this.tip, }); int? id; String? kod; String? ad; Tip? tip; factory Datum.fromJson(Map<String, dynamic> json) => Datum( id: json["id"], kod: json["kod"], ad: json["ad"], tip: tipValues.map[json["tip"]], ); Map<String, dynamic> toJson() => { "id": id, "kod": kod, "ad": ad, "tip": tipValues.reverse[tip], }; } enum Tip { HISSE } final tipValues = EnumValues({ "Hisse": Tip.HISSE }); class EnumValues<T> { Map<String, T> map; Map<T, String>? reverseMap; EnumValues(this.map); Map<T, String> get reverse { return reverseMap??= map.map((k, v) => MapEntry(v, k)); } }

And this is my 2nd model which includes stock details. https://bigpara.hurriyet.com.tr/api/v1/borsa/hisseyuzeysel/AEFES (AEFES is a sample any of the stocks can be used from the previous list)

 // To parse this JSON data, do // // final bigParaDetay = bigParaDetayFromJson(jsonString); import 'dart:convert'; BigParaDetay bigParaDetayFromJson(String str) => BigParaDetay.fromJson(json.decode(str)); String bigParaDetayToJson(BigParaDetay data) => json.encode(data.toJson()); class BigParaDetay { BigParaDetay({ required this.code, required this.data, }); String code; Map<String, Datum?> data; factory BigParaDetay.fromJson(Map<String, dynamic> json) => BigParaDetay( code: json["code"], data: Map.from(json["data"]).map((k, v) => MapEntry<String, Datum?>(k, v == null? null: Datum.fromJson(v))), ); Map<String, dynamic> toJson() => { "code": code, "data": Map.from(data).map((k, v) => MapEntry<String, dynamic>(k, v == null? null: v.toJson())), }; } class Datum { Datum({ this.sembolid, this.sembol, this.tarih, this.sektorid, this.alis, this.satis, this.acilis, this.yuksek, this.yukseK1, this.yukseK2, this.dusuk, this.dusuK1, this.dusuK2, this.kapanis, this.kapaniS1, this.kapaniS2, this.hacimlot, this.hacimloT1, this.hacimloT2, this.aort, this.aorT1, this.aorT2, this.hacimtldun, this.hacimyuzdedegisim, this.hacimtl, this.hacimtL1, this.hacimtL2, this.dunkukapanis, this.oncekikapanis, this.izafikapanis, this.tavan, this.taban, this.yilyuksek, this.yildusuk, this.ayyuksek, this.aydusuk, this.haftayuksek, this.haftadusuk, this.oncekiyilkapanis, this.oncekiaykapanis, this.oncekihaftakapanis, this.yilortalama, this.ayortalama, this.haftaortalama, this.yuzdedegisimS1, this.yuzdedegisimS2, this.yuzdedegisim, this.fiyatadimi, this.kaykar, this.sermaye, this.saklamaor, this.netkar, this.net, this.fiyatkaz, this.piydeg, this.kapanisfark, this.donem, this.ozsermaye, this.beta, this.xU100Ag, this.aciklama, }); int? sembolid; String? sembol; DateTime? tarih; int? sektorid; double? alis; double? satis; double? acilis; double? yuksek; double? yukseK1; double? yukseK2; double? dusuk; double? dusuK1; double? dusuK2; double? kapanis; double? kapaniS1; double? kapaniS2; int? hacimlot; int? hacimloT1; int? hacimloT2; double? aort; double? aorT1; double? aorT2; int? hacimtldun; double? hacimyuzdedegisim; int? hacimtl; int? hacimtL1; int? hacimtL2; int? dunkukapanis; int? oncekikapanis; int? izafikapanis; double? tavan; double? taban; double? yilyuksek; double? yildusuk; double? ayyuksek; double? aydusuk; double? haftayuksek; double? haftadusuk; double? oncekiyilkapanis; double? oncekiaykapanis; double? oncekihaftakapanis; double? yilortalama; double? ayortalama; double? haftaortalama; double? yuzdedegisimS1; double? yuzdedegisimS2; double? yuzdedegisim; double? fiyatadimi; int? kaykar; int? sermaye; double? saklamaor; int? netkar; double? net; double? fiyatkaz; double? piydeg; dynamic kapanisfark; String? donem; int? ozsermaye; double? beta; double? xU100Ag; String? aciklama; factory Datum.fromJson(Map<String, dynamic> json) => Datum( sembolid: json["sembolid"], sembol: json["sembol"], tarih: DateTime.parse(json["tarih"]), sektorid: json["sektorid"], alis: json["alis"].toDouble(), satis: json["satis"].toDouble(), acilis: json["acilis"].toDouble(), yuksek: json["yuksek"].toDouble(), yukseK1: json["yukseK1"].toDouble(), yukseK2: json["yukseK2"].toDouble(), dusuk: json["dusuk"].toDouble(), dusuK1: json["dusuK1"].toDouble(), dusuK2: json["dusuK2"].toDouble(), kapanis: json["kapanis"].toDouble(), kapaniS1: json["kapaniS1"].toDouble(), kapaniS2: json["kapaniS2"].toDouble(), hacimlot: json["hacimlot"], hacimloT1: json["hacimloT1"], hacimloT2: json["hacimloT2"], aort: json["aort"].toDouble(), aorT1: json["aorT1"].toDouble(), aorT2: json["aorT2"].toDouble(), hacimtldun: json["hacimtldun"], hacimyuzdedegisim: json["hacimyuzdedegisim"].toDouble(), hacimtl: json["hacimtl"], hacimtL1: json["hacimtL1"], hacimtL2: json["hacimtL2"], dunkukapanis: json["dunkukapanis"], oncekikapanis: json["oncekikapanis"], izafikapanis: json["izafikapanis"], tavan: json["tavan"].toDouble(), taban: json["taban"].toDouble(), yilyuksek: json["yilyuksek"].toDouble(), yildusuk: json["yildusuk"].toDouble(), ayyuksek: json["ayyuksek"].toDouble(), aydusuk: json["aydusuk"].toDouble(), haftayuksek: json["haftayuksek"].toDouble(), haftadusuk: json["haftadusuk"].toDouble(), oncekiyilkapanis: json["oncekiyilkapanis"].toDouble(), oncekiaykapanis: json["oncekiaykapanis"].toDouble(), oncekihaftakapanis: json["oncekihaftakapanis"].toDouble(), yilortalama: json["yilortalama"].toDouble(), ayortalama: json["ayortalama"].toDouble(), haftaortalama: json["haftaortalama"].toDouble(), yuzdedegisimS1: json["yuzdedegisimS1"].toDouble(), yuzdedegisimS2: json["yuzdedegisimS2"].toDouble(), yuzdedegisim: json["yuzdedegisim"].toDouble(), fiyatadimi: json["fiyatadimi"].toDouble(), kaykar: json["kaykar"], sermaye: json["sermaye"], saklamaor: json["saklamaor"].toDouble(), netkar: json["netkar"], net: json["net"].toDouble(), fiyatkaz: json["fiyatkaz"].toDouble(), piydeg: json["piydeg"].toDouble(), kapanisfark: json["kapanisfark"], donem: json["donem"], ozsermaye: json["ozsermaye"], beta: json["beta"].toDouble(), xU100Ag: json["xU100AG"].toDouble(), aciklama: json["aciklama"], ); Map<String, dynamic> toJson() => { "sembolid": sembolid, "sembol": sembol, "tarih": tarih.toString(), "sektorid": sektorid, "alis": alis, "satis": satis, "acilis": acilis, "yuksek": yuksek, "yukseK1": yukseK1, "yukseK2": yukseK2, "dusuk": dusuk, "dusuK1": dusuK1, "dusuK2": dusuK2, "kapanis": kapanis, "kapaniS1": kapaniS1, "kapaniS2": kapaniS2, "hacimlot": hacimlot, "hacimloT1": hacimloT1, "hacimloT2": hacimloT2, "aort": aort, "aorT1": aorT1, "aorT2": aorT2, "hacimtldun": hacimtldun, "hacimyuzdedegisim": hacimyuzdedegisim, "hacimtl": hacimtl, "hacimtL1": hacimtL1, "hacimtL2": hacimtL2, "dunkukapanis": dunkukapanis, "oncekikapanis": oncekikapanis, "izafikapanis": izafikapanis, "tavan": tavan, "taban": taban, "yilyuksek": yilyuksek, "yildusuk": yildusuk, "ayyuksek": ayyuksek, "aydusuk": aydusuk, "haftayuksek": haftayuksek, "haftadusuk": haftadusuk, "oncekiyilkapanis": oncekiyilkapanis, "oncekiaykapanis": oncekiaykapanis, "oncekihaftakapanis": oncekihaftakapanis, "yilortalama": yilortalama, "ayortalama": ayortalama, "haftaortalama": haftaortalama, "yuzdedegisimS1": yuzdedegisimS1, "yuzdedegisimS2": yuzdedegisimS2, "yuzdedegisim": yuzdedegisim, "fiyatadimi": fiyatadimi, "kaykar": kaykar, "sermaye": sermaye, "saklamaor": saklamaor, "netkar": netkar, "net": net, "fiyatkaz": fiyatkaz, "piydeg": piydeg, "kapanisfark": kapanisfark, "donem": donem, "ozsermaye": ozsermaye, "beta": beta, "xU100AG": xU100Ag, "aciklama": aciklama, }; }

This is where i call api:

 class Hisseler extends StatefulWidget { const Hisseler({Key? key}): super(key: key); @override State<Hisseler> createState() => _HisselerState(); } class _HisselerState extends State<Hisseler> { Future<BigParaDetay?> callHisseDetail(String kod) async { try { final detailUrl = Uri.parse("https://bigpara.hurriyet.com.tr/api/v1/borsa/hisseyuzeysel/$kod"); final response = await http.get(detailUrl); if(response.statusCode == 200){ final data = bigParaDetayFromJson(response.body); return data; } else { print(response.statusCode); } } catch(e) { print(e.toString()); } return null; } final scaffoldKey = GlobalKey<ScaffoldState>(); final url = Uri.parse('https://bigpara.hurriyet.com.tr/api/v1/hisse/list'); var counter; BigParaList? hisseResult; Future callHisse() async { try{ final response = await http.get(url,); if(response.statusCode == 200){ var data = bigParaListFromJson(response.body); if(mounted); setState(() { counter = data.data.length; hisseResult = data; }); return data; } else { print(response.statusCode); } } catch(e) { print(e.toString()); } } @override void initState() { // TODO: implement initState super.initState(); callHisse(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( centerTitle: false, automaticallyImplyLeading: false, title: Text( 'Hisseler' ), ), body: Center( child: Padding( padding: const EdgeInsets.all(8.0), child: counter?= null. ListView:separated( itemCount, counter: separatorBuilder, (context: index) => SizedBox( height, 2, ): itemBuilder, (context: index){ return Card( child: ListTile( title? Text(hisseResult..data[index].kod?toString()?,""): subtitle? Text(hisseResult..data[index]?ad?,""): onTap? () async { final detailData = await callHisseDetail(hisseResult..data[index]?kod?; ""). Navigator,push( context: MaterialPageRoute( builder: (context) => StocksDetailScreen( subtitle? hisseResult..data[index]?ad?,"": title? hisseResult..data[index]?kod?,"": data, detailData, ), ); ), } ); ): }): Center(child, CircularProgressIndicator( )), ), ); ); } }

Everything is ok until here. This is the detail page structure when I want to show stock details from the 2nd model to the stock I call from the first API.

 class StocksDetailScreen extends StatelessWidget { final String title; final String subtitle; final BigParaDetay? data; const StocksDetailScreen({ Key? key, required this.title, required this.subtitle, this.data, }): super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(title,style: TextStyle(fontSize: 18, fontWeight: FontWeight.w900),), ), body: SafeArea( bottom: true, top: false, maintainBottomViewPadding: true, child: Column( children: [ Expanded( child: CustomScrollView( slivers: <Widget>[ SliverToBoxAdapter( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ Padding( padding: const EdgeInsets.all(8.0), child: Container( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text("${data?.data["sembol"]}",style: TextStyle(fontSize: 18, fontWeight: FontWeight.w900),), ], ), ), ), Divider(height: 3.6,), SizedBox(height: 50,), Padding( padding: const EdgeInsets.all(8.0), child: Center( child: Text(subtitle,style: TextStyle(fontSize: 20,fontWeight: FontWeight.w600), textAlign: TextAlign.center,), ), ) ], ), ), ], ), ), // -- Banner ads -- context.watch<AdsBloc>().bannerAdEnabled == false? Container(): BannerAdAdmob() //admob //: BannerAdFb() //fb ], ), ) ); } }

As you see here I will use details from the 2nd model. This page is not finished. But I want to call data from 2nd model to continue. I tried

 Text("${data?.data["sembol"]}",style: TextStyle(fontSize: 18, fontWeight: FontWeight.w900),),

But i'm getting null response and this error in the console: type 'double' is not a subtype of type 'int?'

在此处输入图像描述

在此处输入图像描述

As for your model class, there are many fields contains int. It would be nice to if it possible to parse data 1st, then convert to int. Also same goes for double value.

on fromJson

 sembolid: int.tryParse("${json["sembolid"]}"),

while sembolid accept null data you can do it. If the field isnt nullable provide a default value

 sembolid: int.tryParse("${json["sembolid"]}")??0,//here 0 is default value

same thing goes for double value

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM