Need help to parse json to flutter - flutter

Hello guys i'm trying to learn flutter, and i want to display json information in the app, but i'm struggling to get some information.
This is what i currently have.
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:dio/dio.dart';
void main() {
runApp(new MaterialApp(
home: new HomePage(),
));
}
class HomePage extends StatefulWidget {
#override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
Future<void> _getFutureDados() async {
Uri url = Uri.parse('https://fortnite-api.com/v2/shop/br');
Response response = await Dio().request(url.toString());
List<ItemLoja> itensLoja = List<ItemLoja>();
for (Map<String, dynamic> item in response.data['data']['featured']) {
itensLoja.add(ItemLoja.fromJson(item));
}
#override
void initState() {
super.initState();
_getFutureDados();
}
}
#override
Widget build(BuildContext context) {
_getFutureDados();
return Scaffold(
body: ListView.builder(
itemCount: response.data == null ? 0 : response.data.length,
itemBuilder: (context, index) {
final item = response.data[index];
Text(item.name);
},
));
}
}
class ItemLoja {
final String id;
final String name;
ItemLoja({
this.id,
this.name,
});
ItemLoja.fromJson(Map<String, dynamic> jsonData)
: id = jsonData['id'],
name = jsonData['name'];
}
I can manage to print the json in the terminal, but not in-app. It's not possible to do something like this with forEach?
In php, i can managed to do that and it was easy, getting the name by using ($item[name]) and then putting where i wanted it.
Thanks for any help.
Sorry for my english, but's not my main language.

You can copy paste run full code below
Step 1: You can use Payload.fromJson(response.data), see full code for detail
Step 2: Display with FutureBuilder and nested ListView
code snippet
Future<Payload> _getFutureDados() async {
Uri url = Uri.parse('https://fortnite-api.com/v2/shop/br');
Response response = await Dio().request(url.toString());
if (response.statusCode == 200) {
return Payload.fromJson(response.data);
} else {
throw Exception;
}
}
...
return ListView.separated(
separatorBuilder: (BuildContext context, int index) {
return SizedBox(
height: 10,
);
},
shrinkWrap: true,
itemCount: snapshot.data.data.featured.entries.length,
itemBuilder: (context, index) {
var entries = snapshot.data.data.featured.entries;
return Column(
children: [
Text("price ${entries[index].regularPrice.toString()}"),
ListView.builder(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
working demo
full code
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'dart:convert';
Payload payloadFromJson(String str) => Payload.fromJson(json.decode(str));
String payloadToJson(Payload data) => json.encode(data.toJson());
class Payload {
Payload({
this.status,
this.data,
});
int status;
Data data;
factory Payload.fromJson(Map<String, dynamic> json) => Payload(
status: json["status"],
data: Data.fromJson(json["data"]),
);
Map<String, dynamic> toJson() => {
"status": status,
"data": data.toJson(),
};
}
class Data {
Data({
this.hash,
this.date,
this.featured,
this.daily,
this.specialFeatured,
this.specialDaily,
this.votes,
this.voteWinners,
});
String hash;
DateTime date;
Daily featured;
Daily daily;
Daily specialFeatured;
dynamic specialDaily;
dynamic votes;
dynamic voteWinners;
factory Data.fromJson(Map<String, dynamic> json) => Data(
hash: json["hash"],
date: DateTime.parse(json["date"]),
featured: Daily.fromJson(json["featured"]),
daily: Daily.fromJson(json["daily"]),
specialFeatured: Daily.fromJson(json["specialFeatured"]),
specialDaily: json["specialDaily"],
votes: json["votes"],
voteWinners: json["voteWinners"],
);
Map<String, dynamic> toJson() => {
"hash": hash,
"date": date.toIso8601String(),
"featured": featured.toJson(),
"daily": daily.toJson(),
"specialFeatured": specialFeatured.toJson(),
"specialDaily": specialDaily,
"votes": votes,
"voteWinners": voteWinners,
};
}
class Daily {
Daily({
this.name,
this.entries,
});
String name;
List<Entry> entries;
factory Daily.fromJson(Map<String, dynamic> json) => Daily(
name: json["name"],
entries:
List<Entry>.from(json["entries"].map((x) => Entry.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"name": name,
"entries": List<dynamic>.from(entries.map((x) => x.toJson())),
};
}
class Entry {
Entry({
this.regularPrice,
this.finalPrice,
this.bundle,
this.banner,
this.giftable,
this.refundable,
this.sortPriority,
this.categories,
this.devName,
this.offerId,
this.displayAssetPath,
this.newDisplayAssetPath,
this.items,
});
int regularPrice;
int finalPrice;
dynamic bundle;
Banner banner;
bool giftable;
bool refundable;
int sortPriority;
List<String> categories;
String devName;
String offerId;
String displayAssetPath;
String newDisplayAssetPath;
List<ItemLoja> items;
factory Entry.fromJson(Map<String, dynamic> json) => Entry(
regularPrice: json["regularPrice"],
finalPrice: json["finalPrice"],
bundle: json["bundle"],
banner: json["banner"] == null ? null : Banner.fromJson(json["banner"]),
giftable: json["giftable"],
refundable: json["refundable"],
sortPriority: json["sortPriority"],
categories: List<String>.from(json["categories"].map((x) => x)),
devName: json["devName"],
offerId: json["offerId"],
displayAssetPath:
json["displayAssetPath"] == null ? null : json["displayAssetPath"],
newDisplayAssetPath: json["newDisplayAssetPath"] == null
? null
: json["newDisplayAssetPath"],
items:
List<ItemLoja>.from(json["items"].map((x) => ItemLoja.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"regularPrice": regularPrice,
"finalPrice": finalPrice,
"bundle": bundle,
"banner": banner == null ? null : banner.toJson(),
"giftable": giftable,
"refundable": refundable,
"sortPriority": sortPriority,
"categories": List<dynamic>.from(categories.map((x) => x)),
"devName": devName,
"offerId": offerId,
"displayAssetPath": displayAssetPath == null ? null : displayAssetPath,
"newDisplayAssetPath":
newDisplayAssetPath == null ? null : newDisplayAssetPath,
"items": List<dynamic>.from(items.map((x) => x.toJson())),
};
}
class Banner {
Banner({
this.value,
this.backendValue,
});
String value;
String backendValue;
factory Banner.fromJson(Map<String, dynamic> json) => Banner(
value: json["value"],
backendValue: json["backendValue"],
);
Map<String, dynamic> toJson() => {
"value": value,
"backendValue": backendValue,
};
}
class ItemLoja {
ItemLoja({
this.id,
this.name,
this.description,
this.type,
this.rarity,
this.series,
this.itemSet,
this.introduction,
this.images,
this.variants,
this.gameplayTags,
this.showcaseVideo,
this.displayAssetPath,
this.definitionPath,
this.path,
this.added,
this.shopHistory,
});
String id;
String name;
String description;
Rarity type;
Rarity rarity;
Series series;
Set itemSet;
Introduction introduction;
Images images;
List<Variant> variants;
List<String> gameplayTags;
String showcaseVideo;
String displayAssetPath;
String definitionPath;
String path;
DateTime added;
List<DateTime> shopHistory;
factory ItemLoja.fromJson(Map<String, dynamic> json) => ItemLoja(
id: json["id"],
name: json["name"],
description: json["description"],
type: Rarity.fromJson(json["type"]),
rarity: Rarity.fromJson(json["rarity"]),
series: json["series"] == null ? null : Series.fromJson(json["series"]),
itemSet: json["set"] == null ? null : Set.fromJson(json["set"]),
introduction: Introduction.fromJson(json["introduction"]),
images: Images.fromJson(json["images"]),
variants: json["variants"] == null
? null
: List<Variant>.from(
json["variants"].map((x) => Variant.fromJson(x))),
gameplayTags: List<String>.from(json["gameplayTags"].map((x) => x)),
showcaseVideo:
json["showcaseVideo"] == null ? null : json["showcaseVideo"],
displayAssetPath:
json["displayAssetPath"] == null ? null : json["displayAssetPath"],
definitionPath:
json["definitionPath"] == null ? null : json["definitionPath"],
path: json["path"],
added: DateTime.parse(json["added"]),
shopHistory: List<DateTime>.from(
json["shopHistory"].map((x) => DateTime.parse(x))),
);
Map<String, dynamic> toJson() => {
"id": id,
"name": name,
"description": description,
"type": type.toJson(),
"rarity": rarity.toJson(),
"series": series == null ? null : series.toJson(),
"set": itemSet == null ? null : itemSet.toJson(),
"introduction": introduction.toJson(),
"images": images.toJson(),
"variants": variants == null
? null
: List<dynamic>.from(variants.map((x) => x.toJson())),
"gameplayTags": List<dynamic>.from(gameplayTags.map((x) => x)),
"showcaseVideo": showcaseVideo == null ? null : showcaseVideo,
"displayAssetPath": displayAssetPath == null ? null : displayAssetPath,
"definitionPath": definitionPath == null ? null : definitionPath,
"path": path,
"added": added.toIso8601String(),
"shopHistory":
List<dynamic>.from(shopHistory.map((x) => x.toIso8601String())),
};
}
class Images {
Images({
this.smallIcon,
this.icon,
this.featured,
this.other,
});
String smallIcon;
String icon;
String featured;
dynamic other;
factory Images.fromJson(Map<String, dynamic> json) => Images(
smallIcon: json["smallIcon"],
icon: json["icon"],
featured: json["featured"] == null ? null : json["featured"],
other: json["other"],
);
Map<String, dynamic> toJson() => {
"smallIcon": smallIcon,
"icon": icon,
"featured": featured == null ? null : featured,
"other": other,
};
}
class Introduction {
Introduction({
this.chapter,
this.season,
this.text,
this.backendValue,
});
String chapter;
String season;
TextEnum text;
int backendValue;
factory Introduction.fromJson(Map<String, dynamic> json) => Introduction(
chapter: json["chapter"],
season: json["season"],
text: textValues.map[json["text"]],
backendValue: json["backendValue"],
);
Map<String, dynamic> toJson() => {
"chapter": chapter,
"season": season,
"text": textValues.reverse[text],
"backendValue": backendValue,
};
}
enum TextEnum {
INTRODUCED_IN_CHAPTER_1_SEASON_5,
INTRODUCED_IN_CHAPTER_2_SEASON_2,
INTRODUCED_IN_CHAPTER_2_SEASON_4,
INTRODUCED_IN_CHAPTER_1_SEASON_6,
INTRODUCED_IN_CHAPTER_1_SEASON_9,
INTRODUCED_IN_CHAPTER_2_SEASON_3,
INTRODUCED_IN_CHAPTER_2_SEASON_1
}
final textValues = EnumValues({
"Introduced in Chapter 1, Season 5.":
TextEnum.INTRODUCED_IN_CHAPTER_1_SEASON_5,
"Introduced in Chapter 1, Season 6.":
TextEnum.INTRODUCED_IN_CHAPTER_1_SEASON_6,
"Introduced in Chapter 1, Season 9.":
TextEnum.INTRODUCED_IN_CHAPTER_1_SEASON_9,
"Introduced in Chapter 2, Season 1.":
TextEnum.INTRODUCED_IN_CHAPTER_2_SEASON_1,
"Introduced in Chapter 2, Season 2.":
TextEnum.INTRODUCED_IN_CHAPTER_2_SEASON_2,
"Introduced in Chapter 2, Season 3.":
TextEnum.INTRODUCED_IN_CHAPTER_2_SEASON_3,
"Introduced in Chapter 2, Season 4.":
TextEnum.INTRODUCED_IN_CHAPTER_2_SEASON_4
});
class Set {
Set({
this.value,
this.text,
this.backendValue,
});
String value;
String text;
String backendValue;
factory Set.fromJson(Map<String, dynamic> json) => Set(
value: json["value"],
text: json["text"],
backendValue: json["backendValue"],
);
Map<String, dynamic> toJson() => {
"value": value,
"text": text,
"backendValue": backendValue,
};
}
class Rarity {
Rarity({
this.value,
this.displayValue,
this.backendValue,
});
String value;
String displayValue;
BackendValue backendValue;
factory Rarity.fromJson(Map<String, dynamic> json) => Rarity(
value: json["value"],
displayValue: json["displayValue"],
backendValue: backendValueValues.map[json["backendValue"]],
);
Map<String, dynamic> toJson() => {
"value": value,
"displayValue": displayValue,
"backendValue": backendValueValues.reverse[backendValue],
};
}
enum BackendValue {
E_FORT_RARITY_LEGENDARY,
E_FORT_RARITY_RARE,
E_FORT_RARITY_UNCOMMON,
ATHENA_CHARACTER,
ATHENA_BACKPACK,
ATHENA_DANCE,
ATHENA_ITEM_WRAP,
E_FORT_RARITY_EPIC,
ATHENA_PICKAXE,
ATHENA_GLIDER
}
final backendValueValues = EnumValues({
"AthenaBackpack": BackendValue.ATHENA_BACKPACK,
"AthenaCharacter": BackendValue.ATHENA_CHARACTER,
"AthenaDance": BackendValue.ATHENA_DANCE,
"AthenaGlider": BackendValue.ATHENA_GLIDER,
"AthenaItemWrap": BackendValue.ATHENA_ITEM_WRAP,
"AthenaPickaxe": BackendValue.ATHENA_PICKAXE,
"EFortRarity::Epic": BackendValue.E_FORT_RARITY_EPIC,
"EFortRarity::Legendary": BackendValue.E_FORT_RARITY_LEGENDARY,
"EFortRarity::Rare": BackendValue.E_FORT_RARITY_RARE,
"EFortRarity::Uncommon": BackendValue.E_FORT_RARITY_UNCOMMON
});
class Series {
Series({
this.value,
this.image,
this.backendValue,
});
String value;
String image;
String backendValue;
factory Series.fromJson(Map<String, dynamic> json) => Series(
value: json["value"],
image: json["image"],
backendValue: json["backendValue"],
);
Map<String, dynamic> toJson() => {
"value": value,
"image": image,
"backendValue": backendValue,
};
}
class Variant {
Variant({
this.channel,
this.type,
this.options,
});
String channel;
String type;
List<Option> options;
factory Variant.fromJson(Map<String, dynamic> json) => Variant(
channel: json["channel"],
type: json["type"],
options:
List<Option>.from(json["options"].map((x) => Option.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"channel": channel,
"type": type,
"options": List<dynamic>.from(options.map((x) => x.toJson())),
};
}
class Option {
Option({
this.tag,
this.name,
this.unlockRequirements,
this.image,
});
String tag;
String name;
dynamic unlockRequirements;
String image;
factory Option.fromJson(Map<String, dynamic> json) => Option(
tag: json["tag"],
name: json["name"],
unlockRequirements: json["unlockRequirements"],
image: json["image"],
);
Map<String, dynamic> toJson() => {
"tag": tag,
"name": name,
"unlockRequirements": unlockRequirements,
"image": image,
};
}
class EnumValues<T> {
Map<String, T> map;
Map<T, String> reverseMap;
EnumValues(this.map);
Map<T, String> get reverse {
if (reverseMap == null) {
reverseMap = map.map((k, v) => new MapEntry(v, k));
}
return reverseMap;
}
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
#override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
#override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
Future<Payload> _future;
Future<Payload> _getFutureDados() async {
Uri url = Uri.parse('https://fortnite-api.com/v2/shop/br');
Response response = await Dio().request(url.toString());
if (response.statusCode == 200) {
return Payload.fromJson(response.data);
} else {
throw Exception;
}
}
#override
void initState() {
_future = _getFutureDados();
super.initState();
}
#override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: FutureBuilder(
future: _future,
builder: (context, AsyncSnapshot<Payload> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
return Text('none');
case ConnectionState.waiting:
return Center(child: CircularProgressIndicator());
case ConnectionState.active:
return Text('');
case ConnectionState.done:
if (snapshot.hasError) {
return Text(
'${snapshot.error}',
style: TextStyle(color: Colors.red),
);
} else {
return ListView.separated(
separatorBuilder: (BuildContext context, int index) {
return SizedBox(
height: 10,
);
},
shrinkWrap: true,
itemCount: snapshot.data.data.featured.entries.length,
itemBuilder: (context, index) {
var entries = snapshot.data.data.featured.entries;
return Column(
children: [
Text("price ${entries[index].regularPrice.toString()}"),
ListView.builder(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemCount: entries[index].items.length,
itemBuilder: (context, index1) {
return Card(
elevation: 6.0,
child: Padding(
padding: const EdgeInsets.only(
top: 6.0,
bottom: 6.0,
left: 8.0,
right: 8.0),
child: Row(
crossAxisAlignment:
CrossAxisAlignment.start,
children: <Widget>[
Text("name: ${entries[index].items[index1].name}"),
/* Spacer(),
Text(
"id ${entries[index].items[index1].id}",
),*/
],
),
));
}),
],
);
});
}
}
}));
}
}

I think you need to find some way to handle your request and show the results.
Your code needs some adjustments, but it's not that far from your goal.
One way to solve this is to use FutureBuilder.
In this case you can use the FutureBuider to show a Listview when the future request arrive.
Follow this tutorial, where they use the tools you need: Future Builder with List View Builder

Related

Listview api white screen return problem flutter

this is my model:
// To parse this JSON data, do
//
// final economylistXml = economylistXmlFromJson(jsonString);
import 'dart:convert';
EconomylistXml economylistXmlFromJson(String str) => EconomylistXml.fromJson(json.decode(str));
String economylistXmlToJson(EconomylistXml data) => json.encode(data.toJson());
class EconomylistXml {
EconomylistXml({
required this.rss,
});
Rss rss;
factory EconomylistXml.fromJson(Map<String, dynamic> json) => EconomylistXml(
rss: Rss.fromJson(json["rss"]),
);
Map<String, dynamic> toJson() => {
"rss": rss.toJson(),
};
}
class Rss {
Rss({
required this.empty,
required this.channel,
});
Empty empty;
Channel channel;
factory Rss.fromJson(Map<String, dynamic> json) => Rss(
empty: Empty.fromJson(json["\u0024"]),
channel: Channel.fromJson(json["channel"]),
);
Map<String, dynamic> toJson() => {
"\u0024": empty.toJson(),
"channel": channel.toJson(),
};
}
class Channel {
Channel({
required this.title,
required this.link,
required this.description,
required this.language,
required this.copyright,
required this.image,
required this.item,
});
String? title;
String? link;
String? description;
String? language;
String? copyright;
Image image;
List<Item> item;
factory Channel.fromJson(Map<String, dynamic> json) => Channel(
title: json["title"],
link: json["link"],
description: json["description"],
language: json["language"],
copyright: json["copyright"],
image: Image.fromJson(json["image"]),
item: List<Item>.from(json["item"].map((x) => Item.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"title": title,
"link": link,
"description": description,
"language": language,
"copyright": copyright,
"image": image.toJson(),
"item": List<dynamic>.from(item.map((x) => x.toJson())),
};
}
class Image {
Image({
required this.title,
required this.url,
required this.link,
required this.width,
required this.height,
});
String? title;
String? url;
String? link;
String? width;
String? height;
factory Image.fromJson(Map<String, dynamic> json) => Image(
title: json["title"],
url: json["url"],
link: json["link"],
width: json["width"],
height: json["height"],
);
Map<String, dynamic> toJson() => {
"title": title,
"url": url,
"link": link,
"width": width,
"height": height,
};
}
class Item {
Item({
required this.title,
required this.description,
required this.link,
required this.pubDate,
});
String? title;
String? description;
String? link;
String? pubDate;
factory Item.fromJson(Map<String, dynamic> json) => Item(
title: json["title"],
description: json["description"],
link: json["link"],
pubDate: json["pubDate"],
);
Map<String, dynamic> toJson() => {
"title": title,
"description": description,
"link": link,
"pubDate": pubDate,
};
}
class Empty {
Empty({
required this.version,
});
String? version;
factory Empty.fromJson(Map<String, dynamic> json) => Empty(
version: json["version"],
);
Map<String, dynamic> toJson() => {
"version": version,
};
}
This is where i call api :
import 'package:flutter/material.dart';
import 'package:halkaarzhisseler/models/apis/economy_api.dart';
import 'package:http/http.dart' as http;
import '../models/apis/economy_xml.dart';
import 'haberdetail.dart';
class Economy extends StatefulWidget {
const Economy({Key? key}) : super(key: key);
#override
State<Economy> createState() => _EconomyState();
}
class _EconomyState extends State<Economy> {
ScrollController? controller;
final scaffoldKey = GlobalKey<ScaffoldState>();
final url = Uri.parse('https://v1.nocodeapi.com/miktadtahir/xml_to_json/htvLvoPDCwIEyTxa?url=https://ekonomigundemi.com.tr/rss/ekonomi/246.xml');
var counter;
EconomylistXml? haberResult;
Future callHaber() async {
try{
final response = await http.get(url);
if(response.statusCode == 200){
var rss = economylistXmlFromJson(response.body);
if(mounted);
setState(() {
counter = haberResult?.rss.channel.item.length;
haberResult = rss;
});
return rss;
} else {
print(response.statusCode);
}
} catch(e) {
print(e.toString());
}
}
#override
void initState() {
// TODO: implement initState
super.initState();
callHaber();
}
#override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: false,
automaticallyImplyLeading: false,
title: Text(
'Ekonomi Haberleri'
),
),
body: Center(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: counter != null ?
ListView.builder(
itemCount: counter,
itemBuilder: (context, index){
return Card(
child: ListTile(
title: Text(haberResult?.rss.channel.item[index].title??""),
onTap: () => Navigator.push(
context, MaterialPageRoute(builder: (context) => HaberDetailScreen( subtitle: haberResult?.rss.channel.item[index].title??"", title: haberResult?.rss.channel.item[index].description??"")),),
),
);
}) : Center(child: CircularProgressIndicator(
)),
),
),
);
}
}
/*class Economy extends StatefulWidget {
const Economy({Key? key}) : super(key: key);
#override
State<Economy> createState() => _EconomyState();
}
class _EconomyState extends State<Economy> {
ScrollController? controller;
final scaffoldKey = GlobalKey<ScaffoldState>();
final url = Uri.parse('https://api.collectapi.com/news/getNews?country=tr&tag=economy&padding=10');
var counter;
Economylist? haberResult;
Future callHaber() async {
try{
Map<String, String> requestHeaders = {
'Content-Type': 'application/json',
'Authorization': 'apikey 3fPhNZfVyrl8dOAkT86niI:3g2OzN57bil8vArOdVE3ka'
};
final response = await http.get(url,headers:requestHeaders);
if(response.statusCode == 200){
var result = economylistFromJson(response.body);
if(mounted);
setState(() {
counter = counter = result.result.length;
haberResult = result;
});
return result;
} else {
print(response.statusCode);
}
} catch(e) {
print(e.toString());
}
}
#override
void initState() {
// TODO: implement initState
super.initState();
callHaber();
}
#override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: false,
automaticallyImplyLeading: false,
title: Text(
'Ekonomi Haberleri'
),
),
body: Center(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: counter != null ?
ListView.builder(
itemCount: counter,
itemBuilder: (context, index){
return Card(
child: ListTile(
title: Text(haberResult?.result[index].name??""),
leading: CircleAvatar(
backgroundImage: NetworkImage(haberResult?.result[index].image??""),),
onTap: () => Navigator.push(
context, MaterialPageRoute(builder: (context) => HaberDetailScreen( subtitle: haberResult?.result[index].description??"", title: haberResult?.result[index].name??"",image: haberResult?.result[index].image??"")),),
),
);
}) : Center(child: CircularProgressIndicator(
)),
),
),
);
}
}
*/
I see no error in the console. Only CircularProgressIndicator working. How can i fix this? Thanks for your help
Just switch these two lines:
counter = haberResult?.rss.channel.item.length;
haberResult = rss;
to
haberResult = rss;
counter = haberResult?.rss.channel.item.length;
You are trying to access haberResult before you assign it
Instead of calling api in initState, you should use FutureBuilder like this:
FutureBuilder(
future: callHaber(),
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
} else {
if (snapshot.hasError) {
return Text('has error');
} else {
return ListView.builder(
itemCount: counter,
itemBuilder: (context, index) {
return Card(
child: ListTile(
title: Text(
haberResult?.rss.channel.item[index].title ??
""),
onTap: () => Navigator.push(
context,
MaterialPageRoute(
builder: (context) => HaberDetailScreen(
subtitle: haberResult
?.rss.channel.item[index].title ??
"",
title: haberResult?.rss.channel
.item[index].description ??
"")),
),
),
);
});
}
}
},
)
Replace callHaber() function with this
Future callHaber() async {
try{
final response = await http.get(url);
if(response.statusCode == 200){
haberResult = economylistXmlFromJson(response.body);
if(mounted);
setState(() {
counter = haberResult?.rss.channel.item.length;
});
return haberResult;
} else {
print(response.statusCode);
}
} catch(e) {
print(e.toString());
}
}

Class '_InternalLinkedHashMap<String, dynamic>' has no instance getter 'name'. Receiver: _LinkedHashMap len:7 Tried calling: name Flutter

im trying to call an api.
This is model :
// To parse this JSON data, do
//
// final economylist = economylistFromJson(jsonString);
import 'dart:convert';
Economylist economylistFromJson(String str) => Economylist.fromJson(json.decode(str));
String economylistToJson(Economylist data) => json.encode(data.toJson());
class Economylist {
Economylist({
required this.success,
required this.result,
});
bool success;
List<dynamic> result;
factory Economylist.fromJson(Map<String, dynamic> json) => Economylist(
success: json["success"],
result: List<dynamic>.from(json["result"].map((x) => x)),
);
Map<String, dynamic> toJson() => {
"success": success,
"result": List<dynamic>.from(result.map((x) => x)),
};
}
class ResultClass {
ResultClass({
required this.key,
required this.url,
required this.description,
required this.image,
required this.name,
required this.source,
});
String key;
String url;
String description;
String image;
String name;
String source;
factory ResultClass.fromJson(Map<String, dynamic> json) => ResultClass(
key: json["key"],
url: json["url"],
description: json["description"],
image: json["image"],
name: json["name"],
source: json["source"],
);
Map<String, dynamic> toJson() => {
"key": key,
"url": url,
"description": description,
"image": image,
"name": name,
"source": source,
};
}
This is my file where i call api
import 'package:flutter/material.dart';
import 'package:halkaarzhisseler/models/apis/economy_api.dart';
import 'package:http/http.dart' as http;
class Economy extends StatefulWidget {
const Economy({Key? key}) : super(key: key);
#override
State<Economy> createState() => _EconomyState();
}
class _EconomyState extends State<Economy> {
final scaffoldKey = GlobalKey<ScaffoldState>();
final url = Uri.parse('https://api.collectapi.com/news/getNews?country=tr&tag=economy');
var counter;
Economylist? haberResult;
Future callHaber() async {
try{
Map<String, String> requestHeaders = {
'Content-Type': 'application/json',
'Authorization': 'apikey xxx'
};
final response = await http.get(url,headers:requestHeaders);
if(response.statusCode == 200){
var result = economylistFromJson(response.body);
if(mounted);
setState(() {
counter = result.result.length;
haberResult = result;
});
return result;
} else {
print(response.statusCode);
}
} catch(e) {
print(e.toString());
}
}
#override
void initState() {
// TODO: implement initState
super.initState();
callHaber();
}
#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.builder(
itemCount: counter,
itemBuilder: (context, index){
return Card(
child: ListTile(
title: Text(haberResult?.result[index].name??""),
subtitle: Text(haberResult?.result[index].source??""), ),
);
}) : Center(child: CircularProgressIndicator(
)),
),
),
);
}
}
This is the error i get :
I think im making some mistake when im calling the api about Future but i couldnt fix it. How can i fix this?
thanks for your help
You need to change result property of Economylist class to List. use this model class:
class Economylist {
Economylist({
required this.success,
required this.result,
});
bool success;
List<ResultClass> result;
factory Economylist.fromJson(Map<String, dynamic> json) => Economylist(
success: json["success"],
result: json["result"].map<ResultClass>((x) => ResultClass.fromJson(x)).toList(),
);
Map<String, dynamic> toJson() => {
"success": success,
"result": result.map((x) => x.toJson()),
};
}

Why I can't fetch data by Json on my Flutter App

I wasn't get any data from fake Api : https://jsonplaceholder.typicode.com/users to my flutter App. Can anyone please give me piece of advise why or how I can get those data on my app. For creating the Model file using https://app.quicktype.io/.
JsonModel File:
import 'dart:convert';
List<JsonModel> jsonModelFromJson(String str) =>
List<JsonModel>.from(json.decode(str).map((x) => JsonModel.fromJson(x)));
String jsonModelToJson(List<JsonModel> data) =>
json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
class JsonModel {
JsonModel({
this.id,
this.name,
this.username,
this.email,
this.address,
this.phone,
this.website,
this.company,
});
int? id;
String? name;
String? username;
String? email;
Address? address;
String? phone;
String? website;
Company? company;
factory JsonModel.fromJson(Map<String, dynamic> json) => JsonModel(
id: json["id"],
name: json["name"],
username: json["username"],
email: json["email"],
address: Address.fromJson(json["address"]),
phone: json["phone"],
website: json["website"],
company: Company.fromJson(json["company"]),
);
Map<String, dynamic> toJson() => {
"id": id,
"name": name,
"username": username,
"email": email,
"address": address?.toJson(),
"phone": phone,
"website": website,
"company": company?.toJson(),
};
}
class Address {
Address({
this.street,
this.suite,
this.city,
this.zipcode,
this.geo,
});
String? street;
String? suite;
String? city;
String? zipcode;
Geo? geo;
factory Address.fromJson(Map<String, dynamic> json) => Address(
street: json["street"],
suite: json["suite"],
city: json["city"],
zipcode: json["zipcode"],
geo: Geo.fromJson(json["geo"]),
);
Map<String, dynamic> toJson() => {
"street": street,
"suite": suite,
"city": city,
"zipcode": zipcode,
"geo": geo?.toJson(),
};
}
class Geo {
Geo({
this.lat,
this.lng,
});
String? lat;
String? lng;
factory Geo.fromJson(Map<String, dynamic> json) => Geo(
lat: json["lat"],
lng: json["lng"],
);
Map<String, dynamic> toJson() => {
"lat": lat,
"lng": lng,
};
}
class Company {
Company({
this.name,
this.catchPhrase,
this.bs,
});
String? name;
String? catchPhrase;
String? bs;
factory Company.fromJson(Map<String, dynamic> json) => Company(
name: json["name"],
catchPhrase: json["catchPhrase"],
bs: json["bs"],
);
Map<String, dynamic> toJson() => {
"name": name,
"catchPhrase": catchPhrase,
"bs": bs,
};
}
Service or JsonApi File:
import 'dart:convert';
import 'package:flutter_learning_from_pageview/Model/JsonModel.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart' as http;
class JsonApi {
bool loading = true;
var json_Data;
Future<JsonModel> getJsonData() async {
var client = http.Client();
String uri = "https://jsonplaceholder.typicode.com/users";
var response = await client.get(Uri.parse(uri));
var jsonModel = null;
try {
if (response.statusCode == 200) {
var decode = json.decode(response.body);
jsonModel = JsonModel.fromJson(decode);
print(jsonModel);
} else {
throw Exception("falied to load");
}
} catch (Exception) {
return jsonModel;
}
return jsonModel;
}
}
Try to call it but As progress bar not closed it mean I didn't get the data
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_learning_from_pageview/Model/JsonModel.dart';
import 'package:flutter_learning_from_pageview/Service/JsonApi.dart';
class JsonData extends StatefulWidget {
const JsonData({Key? key}) : super(key: key);
#override
_JsonDataState createState() => _JsonDataState();
}
class _JsonDataState extends State<JsonData> {
bool loading = true;
Future<JsonModel>? _jsonModel;
#override
void initState() {
_jsonModel = JsonApi().getJsonData();
super.initState();
}
#override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
body: FutureBuilder(
future: _jsonModel,
builder: (context, snapshot) {
if (snapshot.hasData) {
return ListView.builder(
//itemCount: json_Data == null ? 0 : json_Data.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(""),
//subtitle: Text(json_Data[index]["body"]),
);
});
} else {
return Center(child: CircularProgressIndicator());
}
},
),
),
);
}
}
You made some mistake so try to change it to like this. you are trying to parse list of data with just a single element.
class JsonApi {
Future<List<JsonModel>> getJsonData() async {
var client = http.Client();
String uri = "https://jsonplaceholder.typicode.com/users";
var response = await client.get(Uri.parse(uri));
if (response.statusCode == 200) {
return jsonModelFromJson(response.body);
} else {
throw Exception("falied to load");
}
}
}
Then try this code
late final Future<List<JsonModel>> _futureData;
apiCalling() {
_futureData = JsonApi().getJsonData();
}
#override
void initState() {
apiCalling();
super.initState();
}
#override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
body: FutureBuilder(
future: _futureData,
builder: (context, AsyncSnapshot<List<JsonModel>> snapshot) {
if (snapshot.hasData) {
return ListView.builder(
itemCount: snapshot.data!.length,
//itemCount: json_Data == null ? 0 : json_Data.length,
itemBuilder: (context, index) {
return ListTile(
onTap: () {
setState(() {});
},
title: Text(snapshot.data![index].name!),
//subtitle: Text(json_Data[index]["body"]),
);
});
} else {
return Center(child: CircularProgressIndicator());
}
},
),
),
);
}
from init state you have to change like this:
#override
void initState() {
callApi();
super.initState();
}
void callApi() async {
_jsonModel = await JsonApi().getJsonData();
}
as you are not calling that with await so, it has no data
I found your issue. You trying to fetch data in wrong jsonModel.
Remove this code
var decode = json.decode(response.body);
jsonModel = JsonModel.fromJson(decode);
Use this Instead
jsonModel = jsonModelFromJson(response.body);
Your Api data is in Array format and you are trying to store in Class format.
Try below code hope its help to you.
Your API Call:
Future<List<dynamic>> getJobsData() async {
String url = 'https://jsonplaceholder.typicode.com/users';
var response = await http.get(Uri.parse(url), headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
});
return json.decode(response.body);
}
Your Widget:
Center(
child: FutureBuilder<List<dynamic>>(
future: getJobsData(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: ListView.builder(
shrinkWrap: true,
physics:const NeverScrollableScrollPhysics(),
itemCount: snapshot.data!.length,
itemBuilder: (context, index) {
var id = snapshot.data![index]['id'];
var name = snapshot.data![index]['name'];
var username = snapshot.data![index]['username'];
var email = snapshot.data![index]['email'];
var phone = snapshot.data![index]['phone'];
return Card(
shape: RoundedRectangleBorder(
side: BorderSide(
color: Colors.green.shade300,
),
borderRadius: BorderRadius.circular(15.0),
),
child: ListTile(
leading: Text(id.toString()),
title: Text(name),
subtitle: Text(
username + '\n' + email + '\n' + phone.toString(),
),
),
);
},
),
);
}
return const CircularProgressIndicator();
},
),
),
Refer my answer here and here for get data from json API
Your Result Screen->
Make sure response.body is returning data.
Avoid using ? in futures, otherwise snapshot could be empty the whole time when body is null. The ui will always show loading.
To make your code look more simple:
Inside statefull widget:
late final Future<List<Data>> _futureData;
And in your initState:
#override
void initState(){
_futureData = provider.loadFutureData();
super.initState();
}
Or if you don't are using provider:
#override
void initState(){
_futureData = loadDataFromFunction();
super.initState();
}

create gridView using dynamic JSON data in Flutter

I want to create gridView using dynamic JSON data in Flutter
JSON Data
name;
description;
image;
price;
discountAmount;
status;
as gridview vertical *2
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
#override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Home(),
);
}
}
class Home extends StatefulWidget {
#override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
Future<Products> getApiData() async {
var url = "https://gorest.co.in/public-api/products";
var response = await http.get(url);
var jsonString = response.body;
Products products = productsFromJson(jsonString);
print(jsonString);
return products;
}
#override
void initState() {
super.initState();
getApiData().then((value) => print(value));
}
#override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("helloo"),
centerTitle: true,
),
);
}
}
I am building an app using flutter. I want to show a gridview and inside that gridview of data. I have a JSON Api
which the response is like this.
// To parse this JSON data, do
//
// final products = productsFromJson(jsonString);
Products productsFromJson(String str) => Products.fromJson(json.decode(str));
String productsToJson(Products data) => json.encode(data.toJson());
class Products {
Products({
this.code,
this.meta,
this.data,
});
int code;
Meta meta;
List<Datum> data;
factory Products.fromJson(Map<String, dynamic> json) => Products(
code: json["code"],
meta: Meta.fromJson(json["meta"]),
data: List<Datum>.from(json["data"].map((x) => Datum.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"code": code,
"meta": meta.toJson(),
"data": List<dynamic>.from(data.map((x) => x.toJson())),
};
}
class Datum {
Datum({
this.id,
this.name,
this.description,
this.image,
this.price,
this.discountAmount,
this.status,
this.categories,
});
int id;
String name;
String description;
String image;
String price;
String discountAmount;
bool status;
List<Category> categories;
factory Datum.fromJson(Map<String, dynamic> json) => Datum(
id: json["id"],
name: json["name"],
description: json["description"],
image: json["image"],
price: json["price"],
discountAmount: json["discount_amount"],
status: json["status"],
categories: List<Category>.from(
json["categories"].map((x) => Category.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"id": id,
"name": name,
"description": description,
"image": image,
"price": price,
"discount_amount": discountAmount,
"status": status,
"categories": List<dynamic>.from(categories.map((x) => x.toJson())),
};
}
class Category {
Category({
this.id,
this.name,
});
int id;
String name;
factory Category.fromJson(Map<String, dynamic> json) => Category(
id: json["id"],
name: json["name"],
);
Map<String, dynamic> toJson() => {
"id": id,
"name": name,
};
}
class Meta {
Meta({
this.pagination,
});
Pagination pagination;
factory Meta.fromJson(Map<String, dynamic> json) => Meta(
pagination: Pagination.fromJson(json["pagination"]),
);
Map<String, dynamic> toJson() => {
"pagination": pagination.toJson(),
};
}
class Pagination {
Pagination({
this.total,
this.pages,
this.page,
this.limit,
});
int total;
int pages;
int page;
int limit;
factory Pagination.fromJson(Map<String, dynamic> json) => Pagination(
total: json["total"],
pages: json["pages"],
page: json["page"],
limit: json["limit"],
);
Map<String, dynamic> toJson() => {
"total": total,
"pages": pages,
"page": page,
"limit": limit,
};
}
like this one
Try to get an idea and implement in this way in your main dart file
#override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("helloo"),
centerTitle: true,
body : GridView.builder(
shrinkWrap: true,
physics: ScrollPhysics(),
itemCount: (snapshot.data.length) != null ? snapshot.data.length : 0, // your getApiData()
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
itemBuilder: (context, index) {
return YourItemDesign(
product: snapshot.data[index],
);
},
),
),
);
}

How can I convert my provider into service?

I'm building a very simple applciation which allows a user to stream anime. However, I have a hard time working with provider. I almost understand how it works, but I have some questions.
I fetch all anime list from an api. It works flawlessly, but I want to separate my code into services and providers.
Here's my code:
Code
main.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_provider/providers/anime.dart';
import 'models/anime_all.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
#override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => AnimeTwistApiService(),
child: MaterialApp(
title: 'Test',
home: HomeScreen(),
),
);
}
}
class HomeScreen extends StatelessWidget {
#override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Test'),
),
body: Center(
child: Column(
children: [
FutureBuilder(
future: context.watch<AnimeTwistApiService>().getAllAnime(),
builder: (BuildContext context,
AsyncSnapshot<List<AnimeAll>> snapshot) {
List<Widget> list = List<Widget>();
for (var i = 0; i < snapshot.data.length; i++) {
list.add(Text(snapshot.data[i].title.toString()));
}
return Column(
children: list,
);
},
)
],
),
));
}
}
models/anime_all.dart
import 'dart:convert';
List<AnimeAll> animeAllFromJson(String str) =>
List<AnimeAll>.from(json.decode(str).map((x) => AnimeAll.fromJson(x)));
String animeAllToJson(List<AnimeAll> data) =>
json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
class AnimeAll {
AnimeAll({
this.id,
this.title,
this.altTitle,
this.season,
this.ongoing,
this.hbId,
this.createdAt,
this.updatedAt,
this.hidden,
this.malId,
this.slug,
});
int id;
String title;
String altTitle;
int season;
int ongoing;
int hbId;
DateTime createdAt;
DateTime updatedAt;
int hidden;
int malId;
Slug slug;
factory AnimeAll.fromJson(Map<String, dynamic> json) => AnimeAll(
id: json["id"],
title: json["title"],
altTitle: json["alt_title"] == null ? null : json["alt_title"],
season: json["season"],
ongoing: json["ongoing"],
hbId: json["hb_id"] == null ? null : json["hb_id"],
createdAt: DateTime.parse(json["created_at"]),
updatedAt: DateTime.parse(json["updated_at"]),
hidden: json["hidden"],
malId: json["mal_id"] == null ? null : json["mal_id"],
slug: Slug.fromJson(json["slug"]),
);
Map<String, dynamic> toJson() => {
"id": id,
"title": title,
"alt_title": altTitle == null ? null : altTitle,
"season": season,
"ongoing": ongoing,
"hb_id": hbId == null ? null : hbId,
"created_at": createdAt.toIso8601String(),
"updated_at": updatedAt.toIso8601String(),
"hidden": hidden,
"mal_id": malId == null ? null : malId,
"slug": slug.toJson(),
};
}
class Slug {
Slug({
this.id,
this.slug,
this.animeId,
this.createdAt,
this.updatedAt,
});
int id;
String slug;
int animeId;
DateTime createdAt;
DateTime updatedAt;
factory Slug.fromJson(Map<String, dynamic> json) => Slug(
id: json["id"],
slug: json["slug"],
animeId: json["anime_id"],
createdAt: DateTime.parse(json["created_at"]),
updatedAt: DateTime.parse(json["updated_at"]),
);
Map<String, dynamic> toJson() => {
"id": id,
"slug": slug,
"anime_id": animeId,
"created_at": createdAt.toIso8601String(),
"updated_at": updatedAt.toIso8601String(),
};
}
providers/anime_twist.dart
import 'package:flutter/material.dart';
import 'package:test_provider/models/anime_all.dart';
import 'package:http/http.dart' as http;
class AnimeTwistApiService extends ChangeNotifier {
Future<List<AnimeAll>> getAllAnime() async {
const String baseUrl = 'https://twist.moe/api/anime';
final http.Response response = await http.get(baseUrl,
headers: {'x-access-token': '1rj2vRtegS8Y60B3w3qNZm5T2Q0TN2NR'});
return animeAllFromJson(response.body);
}
}
It looks nice to be honest, but I don't want to have my provider handle all of that. I would like to separate it into services and providers? How do I do it?