cannot access JSON datas - flutter

I cannot access categories.id and name. But code should be work. Unfortunately I cannot find the reason.
here is category.view:
import 'package:flutter/material.dart';
import '/data/models/models.dart';
import '/data/services/services.dart';
import '/data/models/category.dart';
class CategoryViewDetail extends StatefulWidget {
const CategoryViewDetail({Key? key}) : super(key: key);
#override
_CategoryViewDetailState createState() => _CategoryViewDetailState();
}
class _CategoryViewDetailState extends State<CategoryViewDetail> {
final _categoryService = NewsService();
late Future<Categories> _futureCategories;
#override
void initState() {
_futureCategories = _categoryService.getAllCategories();
super.initState();
}
...
...
...
...
child: FutureBuilder<Categories>(
future: _futureCategories,
builder: (BuildContext context, AsyncSnapshot<Categories> snapshot) {
if (snapshot.hasData) {
final categories = snapshot.data?.data;
return Card(
elevation: 4.0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0),
),
child: ListTile(
title: Text(
'Title: ${categories?.name}',
),
subtitle: Text(
'Content: ${categories?.id}',
),
),
);
news_service.dart
Future<Categories> getAllCategories() async {
final _queryParametersCategoryId = {
"route": "services/news/getAllCategories",
};
///
final _url = Uri.https(
_authority,
_unencodedPath,
_queryParametersCategoryId,
);
///
final _headers = <String, String>{
'content-type': 'application/json',
};
///
final _response = await http.get(
_url,
headers: _headers,
);
/// JSON Object To String
final _jsonBody = _response.body;
/// String To Map
final Map<String, dynamic> _decodedBody = jsonDecode(_jsonBody);
/// JSON (Map) To Dart (Object)
final _articleIdResponse = Categories.fromJson(_decodedBody);
switch (_response.statusCode) {
case 200:
/// Response: Dart Object
return _articleIdResponse;
and finally category.dart
class Categories {
const Categories({
this.success,
this.message,
this.errorCode,
this.data,
});
final bool? success;
final String? message;
final int? errorCode;
final List<Category>? data;
factory Categories.fromJson(Map<String, dynamic> json) => Categories(
success: json["success"],
message: json["message"],
errorCode: json["error_code"],
data:
List<Category>.from(json["data"].map((x) => Category.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"success": success,
"message": message,
"error_code": errorCode,
"data": List<dynamic>.from(data!.map((x) => x.toJson())),
};
}
class Category {
const Category({
this.id,
this.name,
});
final String? id;
final String? name;
factory Category.fromJson(Map<String, dynamic> json) => Category(
id: json["id"],
name: json["name"],
);
Map<String, dynamic> toJson() => {
"id": id,
"name": name,
};
}
I am newbie and more than one week I am trying many things to do fix it but unfortunately I could not find the problem. The section of my apps news, images, an all other stuff works but I cannot get categories.
Any help?

final categories = snapshot.data?.data;
You have defined the parameter data as a List<Category> inside the Categories class.
That's why you can't access to name or id parameters doing categories.name.
You need first to access to a certain position like categories[0].name.
I suggest you to return a ListView.builder from the FutureBuilder.

Related

My app doesn't recognize data from model file

Hello this is my model file;
// To parse this JSON data, do
//
// final hisselist = hisselistFromJson(jsonString);
import 'dart:convert';
Hisselist hisselistFromJson(String str) => Hisselist.fromJson(json.decode(str));
String hisselistToJson(Hisselist data) => json.encode(data.toJson());
class Hisselist {
Hisselist({
required this.success,
required this.result,
});
bool success;
List<dynamic> result;
factory Hisselist.fromJson(Map<String, dynamic> json) => Hisselist(
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.rate,
required this.lastprice,
required this.lastpricestr,
required this.hacim,
required this.hacimstr,
required this.text,
required this.code,
});
double rate;
double lastprice;
String lastpricestr;
double hacim;
String hacimstr;
String text;
String code;
factory ResultClass.fromJson(Map<String, dynamic> json) => ResultClass(
rate: json["rate"].toDouble(),
lastprice: json["lastprice"].toDouble(),
lastpricestr: json["lastpricestr"],
hacim: json["hacim"].toDouble(),
hacimstr: json["hacimstr"],
text: json["text"],
code: json["code"],
);
Map<String, dynamic> toJson() => {
"rate": rate,
"lastprice": lastprice,
"lastpricestr": lastpricestr,
"hacim": hacim,
"hacimstr": hacimstr,
"text": text,
"code": code,
};
}
And this is my file where i call API
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:easy_localization/easy_localization.dart';
import '../models/apis/hisselist.dart';
class Stocks extends StatefulWidget {
Stocks({Key? key}) : super(key: key);
#override
_StocksState createState() => _StocksState();
}
class _StocksState extends State<Stocks> with AutomaticKeepAliveClientMixin {
ScrollController? controller;
final scaffoldKey = GlobalKey<ScaffoldState>();
final url = Uri.parse('https://api.collectapi.com/economy/hisseSenedi');
var counter;
var hisseResult;
Future callHisse() 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 = hisselistFromJson(response.body);
if(mounted);
setState(() {
counter = 200;
hisseResult = result;
});
return result;
} else {
print(response.statusCode);
}
} catch(e) {
print(e.toString());
}
}
#override
void initState() {
// TODO: implement initState
super.initState();
callHisse();
}
#override
Widget build(BuildContext context) {
super.build(context);
return Scaffold(
appBar: AppBar(
centerTitle: false,
automaticallyImplyLeading: false,
title: Text(
'Hisseler'
).tr(),
),
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(hisseResult.data[index].code),
subtitle: Text(hisseResult.data[index].text),
),
);
}) : Center(child: CircularProgressIndicator(
)),
),
),
);
}
#override
bool get wantKeepAlive => true;
}
And I'm getting this error?
What's wrong with it?
Thanks for your help
Hisselist class has only two properties, success and result.
This line of code returns result that is Hisselist type:
var result = hisselistFromJson(response.body);
You should avoid using var type here and set Hisselist instead:
Hisselist? result = hisselistFromJson(response.body);
hisseResult variable is also Hisselist type so you can only use success and result properties, there is no data property defined in Hisselist class.
Hisselist? hisseResult instead od var type.
title: Text(hisseResult?.result[index].code ?? ""),
subtitle: Text(hisseResult?.result[index].text ?? ""),
There is no field as it described on your model class
I think you want result.
Try var hisseResult; to Hisselist? hisseResult;
title: Text(hisseResult?.result[index].code??""),
hisseResult.result[index] replace for hisseResult.data[index]
itemCount: hisseResult.result.length replace for itemCount: counter,

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

Need help to parse json to 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