Home > OS >  error: The property 'sembol' can't be unconditionally accessed because the receiver c
error: The property 'sembol' can't be unconditionally accessed because the receiver c

Time:08-21

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.

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

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.sembol,style: TextStyle(fontSize: 18, fontWeight: FontWeight.w900),),

to show the data from the 2nd model but I get this error: The property 'symbol' can't be unconditionally accessed because the receiver can be 'null'. How can I fix this? How can I call data from the 2n model on the detail page? Thanks for your help


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

CodePudding user response:

Your data is nullable final BigParaDetay? data;, provide default value on cases like

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

if you like access sembol it will be like

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

data?.data will provide a map of

  • Related