错误:无法无条件访问属性"sembol",因为接收器可能会'null'颤振



我使用这个json来列出股票(BIST(。https://bigpara.hurriyet.com.tr/api/v1/hisse/list这是我的型号:

// 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));
}
}

这是我的第二个模型,包括库存细节。https://bigpara.hurriyet.com.tr/api/v1/borsa/hisseyuzeysel/AEFES(AEFES是一个样本,可以使用之前列表中的任何库存(

// 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,
};
}

这就是我调用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(
)),
),
),
);
}
}

在这里之前一切都很好。当我想显示从第二个模型到我从第一个API调用的股票的详细信息时,这是详细页面结构。

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../blocs/ads_bloc.dart';
import '../models/apis/bigpara_detay.dart';
import '../widgets/banner_ad_admob.dart';

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.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
],
),
)
);
}
}

正如你在这里看到的,我将使用第二个模型的细节。此页尚未完成。但我想调用第二个模型的数据继续。我试过

Text(data.sembol,style: TextStyle(fontSize: 18, fontWeight: FontWeight.w900),),

以显示来自第二个模型的数据,但我得到了这个错误:不能无条件地访问属性"symbol",因为接收器可以是"null"。我该怎么解决这个问题?如何在详细信息页面上调用2n模型的数据?感谢您的帮助


BigParaDetay

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;
}

您的data可以为空final BigParaDetay? data;,在等情况下提供默认值

Text(data?.data??"got null", ),

如果你喜欢访问sembol,它将像一样

Text("${data?.data.values.first["sembol"]}")
//or
Text("${data?.data.values?.first["sembol"]}")

data?.data将提供的地图

相关内容

最新更新