'Get data from API but getting type 'String' is not a subtype of type 'int' of 'index'
I am getting data from API but getting error type 'String' is not a subtype of type 'int' of 'index'. When I add data in to the server and after adding when I am receiving data from the server I am getting this error. I am using Listview.builder to get the data from the Api. There are three classes for this task
- Inventory (Model)
- InventoryService (service class)
- InventoryController ( controller class)
- UserInventoryScreen (view class)
My Model Class is
class Inventory {
String? quantity;
String? description;
String? fieldname;
String? originalname;
String? encoding;
String? mimetype;
String? id;
String? filename;
Metadata? metadata;
String? bucketName;
int? chunkSize;
int? size;
String? md5;
DateTime? uploadDate;
String? contentType;
String? url;
Inventory({
this.quantity,
this.description,
this.fieldname,
this.originalname,
this.encoding,
this.mimetype,
this.id,
this.filename,
this.metadata,
this.bucketName,
this.chunkSize,
this.size,
this.md5,
this.uploadDate,
this.contentType,
this.url,
});
factory Inventory.fromJson(Map<String, dynamic> json) => Inventory(
quantity: json["quantity"],
description: json["description"],
fieldname: json["fieldname"],
originalname: json["originalname"],
encoding: json["encoding"],
mimetype: json["mimetype"],
id: json["_id"],
filename: json["filename"],
metadata: Metadata.fromJson(json["metadata"]),
bucketName: json["bucketName"],
chunkSize: json["chunkSize"],
size: json["size"],
md5: json["md5"],
uploadDate: DateTime.parse(json["uploadDate"]),
contentType: json["contentType"],
url: json["url"],
);
Map<String, dynamic> toJson() => {
"quantity": quantity,
"description": description,
"fieldname": fieldname,
"originalname": originalname,
"encoding": encoding,
"mimetype": mimetype,
"_id": id,
"filename": filename,
"metadata": metadata!.toJson(),
"bucketName": bucketName,
"chunkSize": chunkSize,
"size": size,
"md5": md5,
"uploadDate": uploadDate!.toIso8601String(),
"contentType": contentType,
"url": url,
};
}
class Metadata {
Metadata({
this.description,
this.quantity,
this.url
});
String? description;
String? quantity;
String? url;
factory Metadata.fromJson(Map<String, dynamic> json) => Metadata(
description: json["description"],
quantity: json["quantity"],
url: json["url"],
);
Map<String, dynamic> toJson() => {
"description": description,
"quantity": quantity,
"url": url
};
}
My InventoryService class code is
Future<List<Inventory>> requestInventory(
String accessToken, String userId) async {
final response = await http.get(Uri.parse('${AppUrl.getInventory}/$userId'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Barear $accessToken'
});
late List<Inventory> list;
if (response.statusCode == 200) {
var value = jsonDecode(response.body);
var data = value['details']['data']['user']['inventory'];
if (data != null || data != []) {
list = data.map<Inventory>((json) => Inventory.fromJson(json)).toList();
return list;
} else {
return list = [];
}
} else {
return list = [];
}
}
My InventoryController class code is
Future getMyInvenoryFromService() async {
try {
isLoadingInventory(true);
String? userId = await preferenceService.getuserId();
String? accessToken = await preferenceService.getAccessToken();
await inventoryService.requestInventory(accessToken!, userId!).then((val) {
inventoryData = val;
}
);
} finally {
isLoadingInventory(false);
}
}
And My UserInventoryScreen class code is
import 'package:bartermade/controllers/giftController.dart';
import 'package:bartermade/services/giftStorageService.dart';
import 'package:bartermade/widgets/snackBar.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:bartermade/controllers/inventoryController.dart';
import 'package:bartermade/screens/Inventory/addInventory.dart';
import 'package:bartermade/utils/app_colors.dart';
class UserInventoryScreen extends StatefulWidget {
final String isScreen;
const UserInventoryScreen({
Key? key,
required this.isScreen,
}) : super(key: key);
@override
_UserInventoryScreenState createState() => _UserInventoryScreenState();
}
class _UserInventoryScreenState extends State<UserInventoryScreen> {
InventoryController inventoryController = Get.put(InventoryController());
GiftController giftController = Get.put(GiftController());
GiftStorageService giftStorageService = GiftStorageService();
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColors.pinkAppBar,
appBar: AppBar(
elevation: 0,
backgroundColor: Colors.transparent,
leading: InkWell(
onTap: () {
Get.back();
},
child: Icon(Icons.arrow_back)),
title: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Inventory'),
InkWell(
onTap: () {
Get.to(AddInventoryScreen());
},
child: Container(
padding: EdgeInsets.symmetric(horizontal: 10, vertical: 5),
decoration:
BoxDecoration(border: Border.all(color: Colors.white)),
child: Text(
"Add Inventory",
style: TextStyle(fontSize: 16),
),
),
)
],
),
),
body: Container(
width: double.infinity,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(18),
topRight: Radius.circular(18),
)),
margin: EdgeInsets.only(top: 20),
padding: EdgeInsets.symmetric(horizontal: 08, vertical: 05),
child: Obx(() {
if (inventoryController.isLoadingInventory.value) {
return Center(child: CircularProgressIndicator());
} else {
return ListView.builder(
itemCount: inventoryController.myInventoryList.length,
itemBuilder: (context, index) {
return InkWell(
onTap: () async {
if (widget.isScreen == 'gift') {
var check = await giftStorageService.idExist(
inventoryController.myInventoryList[index].id);
if (check) {
showSnackBar('Gift already exist', context);
} else {
String id =
'${inventoryController.myInventoryList[index].id}';
giftStorageService.saveInventoryId(id);
giftController.giftList.add(
inventoryController.myInventoryList[index]);
}
}
Get.back();
},
child: Column(
children: [
Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
width: 1, color: Colors.black12))),
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 5.0, horizontal: 08),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Container(
height: 100,
width: 200,
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.fitWidth,
image: NetworkImage(
inventoryController
.myInventoryList[
index]
.url ??
""))),
),
PopupMenuButton(
itemBuilder: (context) => [
PopupMenuItem(
onTap: () {
print(inventoryController
.myInventoryList[index]
.id);
var list = inventoryController
.myInventoryList
.where((i) =>
i.id !=
inventoryController
.myInventoryList[
index]
.id)
.toList();
print('List is => ${list}');
inventoryController
.deleteInventory(
list, context);
},
value: 1,
child: Padding(
padding:
const EdgeInsets.all(
8.0),
child: Text(
"Delete",
style: TextStyle(
color: AppColors
.pinkAppBar,
fontWeight:
FontWeight.w700),
),
),
),
]),
],
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
'${inventoryController.myInventoryList[index].description}',
style: TextStyle(
fontSize: 12,
),
maxLines: 5,
),
),
Padding(
padding: const EdgeInsets.only(right: 15.0),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text('',
style: TextStyle(fontSize: 11)),
],
),
)
],
),
),
),
Divider(height: 05),
],
),
);
});
}
})),
);
}
}
and my api response is
{
"details": "got user successfully",
"data": {
"user": {
"role": "user",
"banned": false,
"bannedTill": null,
"inventory": [
{
"quantity": "23",
"description": "this is my data",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "This my first inventory ",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "this is ",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "fvgg",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "dtff",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "2",
"description": "this is the description",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "hsbsbsnansb",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "hbhh",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "htbfnfn",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "My mobile",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "Infinix mobile",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "Infiiiiixxxx Mobile",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": null,
"description": "this is the description",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": null,
"description": null,
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "Blue Mobile ",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "Blue smart mobile",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "Smart mobile ",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "hello dev",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "bsjsb",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "hello",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "mobile",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "helpo ",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "desc",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "descc",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "hellog",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "check blue",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "this is app inventory ",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "fhbbj",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "yuj",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "hello",
"url": "http://localhost/api/media/inventory-pictures/undefined"
},
{
"quantity": "0",
"description": "ghb",
"url": "http://localhost/api/media/inventory-pictures/undefined"
}
],
"fcmToken": null,
"profilePictureURL": "https://cdn.luxe.digital/media/2019/09/12090502/business-professional-dress-code-men-style-luxe-digital.jpg",
"_id": "624bac63fbf73b08462af651",
"createdAt": "2022-04-05T02:41:39.754Z",
"updatedAt": "2022-04-09T08:43:16.427Z",
"firstName": "saad",
"lastName": "ebad"
},
"posts": [
{
"tradeWithPictures": [
{
"publicID": "bartermade/post-pictures/oqzvs8cnioj2yncpembd",
"url": "https://res.cloudinary.com/dtksvfjsi/image/upload/v1649202575/bartermade/post-pictures/oqzvs8cnioj2yncpembd.jpg"
}
],
"tags": [
"Camera",
"Mobile",
"Cycles"
],
"pictures": [
{
"publicID": "bartermade/post-pictures/vuepwgaymffwhdvcz3lx",
"url": "https://res.cloudinary.com/dtksvfjsi/image/upload/v1649202573/bartermade/post-pictures/vuepwgaymffwhdvcz3lx.jpg"
}
],
"comments": [
{
"text": "bsbsn",
"profile": {
"role": "user",
"banned": false,
"bannedTill": null,
"inventory": [],
"fcmToken": "",
"profilePictureURL": "https://cdn.luxe.digital/media/2019/09/12090502/business-professional-dress-code-men-style-luxe-digital.jpg",
"_id": "624bac63fbf73b08462af651",
"createdAt": "2022-04-05T02:41:39.754Z",
"updatedAt": "2022-04-06T04:29:06.535Z",
"firstName": "saad",
"lastName": "ebad"
}
}
],
"_id": "624cd591fbf73b08462afb73",
"title": "Infinix",
"description": "Infinix note 8",
"category": "mobiles",
"subCategory": "smart phones",
"condition": "Old",
"user": "624bac63fbf73b08462af651",
"createdAt": "2022-04-05T23:49:37.116Z",
"updatedAt": "2022-04-06T04:33:40.069Z"
}
]
}
}
Solution 1:[1]
when fetching data from api why not create our own model and return the data which we get from api to our model.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Sujan |
