我试图将一个类提供程序构建为数组列表,以便从API提取数据,但是我找不到足够的方法来获取数据。我一直在不断出错。而且我无法弄清楚如何用类值列出数组。
这是API中代码的外观(将更改实际值只是为了显示示例):
{
"listProduct": [
{
"id": 127,
"title": "String",
"Date": "2019-10-31T10:03:35",
"Price": 25.0,
"category": "Jeep",
"brand": "مرسيدس",
"brandModel": "M300",
"kilometer": 300.0,
"modelYear": "2010",
"fuelType": "بنزين",
"gearType": "اوتوماتك",
"image": {
"path": "Upload/UploadCarMain/UploadCarMain-200-200/car.jpeg",
"name": "car.jpeg"
},
],
}
这是应该放在数组中的我的类提供程序数据(该数据具有将被放入“listProduct”中的所有值):
class AddCar {
int id;
String name;
String city;
String country;
String currencyT;
double price;
String date;
String sponsNum;
String category;
String company;
String model;
String year;
String engine;
double distanceCovered;
String transmission;
String oilT;
String outColor;
String inColor;
String description;
File image;
PlaceLocation location;
bool isFavorite;
AddCar({
this.id,
this.name,
this.city,
this.country,
this.currencyT,
this.price,
this.date,
this.sponsNum,
this.category,
this.company,
this.model,
this.year,
this.engine,
this.distanceCovered,
this.transmission,
this.oilT,
this.outColor,
this.inColor,
this.description,
this.image,
this.location,
this.isFavorite = false,
});
}
这是我的获取代码(这些是我需要为显示的当前代码获取的值):
Future<void> fetchAndSetCars() async {
const url =
'My link';
final response = await http.get(url);
final extractedData = json.decode(response.body) as Map<String, dynamic>;
List<AddCar> loadedCars = [];
extractedData.forEach((carId, carData) {
loadedCars.add(AddCar(
id: int.parse(carId),
name: carData['Title'],
currencyT: carData['gearType'],
price: carData['Price'],
date: carData['Date'],
model: carData['brandModel'],
year: carData['modelYear'],
distanceCovered: carData['kilometer'],
transmission: carData['gearType'],
oilT: carData['fuelType'],
image: File(carData['image']),
));
});
_cars = loadedCars;
print(json.decode(response.body));
notifyListeners();
}
这是我显示提取代码的位置:
class CarArea extends StatefulWidget {
@override
_CarAreaState createState() => _CarAreaState();
}
class _CarAreaState extends State<CarArea> {
var _isInit = true;
@override
void didChangeDependencies() {
if (_isInit) {
Provider.of<Cars>(context).fetchAndSetCars();
}
_isInit = false;
super.didChangeDependencies();
}
@override
Widget build(BuildContext context) {
final carsData = Provider.of<Cars>(context);
final car = carsData.cars;
return car.isEmpty
? Padding(
padding: EdgeInsets.all(15.0),
child: Center(
child: Text(
'no cars available',
style: TextStyle(
fontFamily: ArabicFonts.Tajawal,
fontWeight: FontWeight.bold,
package: 'google_fonts_arabic',
),
)))
: car.length < 2
? ListView.builder(
physics: NeverScrollableScrollPhysics(),
itemCount: car.length = 1,
shrinkWrap: true,
itemBuilder: (ctx, i) => CarItem(
car[i].id,
car[i].image,
car[i].name,
car[i].model,
car[i].currencyT,
car[i].price,
car[i].distanceCovered,
car[i].transmission,
car[i].oilT,
car[i].year,
car[i].date,
),
)
: ListView.builder(
physics: NeverScrollableScrollPhysics(),
itemCount: car.length = 2,
shrinkWrap: true,
itemBuilder: (ctx, i) => CarItem(
car[i].id,
car[i].image,
car[i].name,
car[i].model,
car[i].currencyT,
car[i].price,
car[i].distanceCovered,
car[i].transmission,
car[i].oilT,
car[i].year,
car[i].date,
),
);
}
}
和我的CarItem,其中代码显示在UI中:
class CarItem extends StatelessWidget {
final int id;
final File image;
final String name;
final String model;
final String currencyT;
final double price;
final double distanceCovered;
final String transmission;
final String oilT;
final String year;
final String date;
CarItem(
this.id,
this.image,
this.name,
this.model,
this.currencyT,
this.price,
this.distanceCovered,
this.transmission,
this.oilT,
this.year,
this.date,
);
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(color: Theme.of(context).primaryColor, width: 2.0),
),
),
child: Column(
children: <Widget>[
Container(
decoration: BoxDecoration(
color: Color.fromARGB(255, 245, 245, 245),
),
child: Padding(
padding: const EdgeInsets.fromLTRB(17.0, 4.0, 17.0, 4.0),
child: Row(
textDirection: TextDirection.rtl,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Container(
child: Row(
textDirection: TextDirection.rtl,
children: <Widget>[
Padding(
padding: const EdgeInsets.fromLTRB(5.0, 0, 0, 0),
child: Icon(
MyFlutterApp.cars,
),
),
Text(
AppLocalizations.of(context).itemListCar,
),
],
),
),
Container(
child: Row(
children: <Widget>[
Text(
date.toString(),
),
Padding(
padding: const EdgeInsets.fromLTRB(0, 0, 5.0, 0),
child: Icon(
MyFlutterApp.history,
),
),
],
),
),
],
),
),
),
Row(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Container(
width: MediaQuery.of(context).size.width * 0.35,
height: MediaQuery.of(context).size.width * 0.35,
child: GestureDetector(
child: image == null
? Container(
decoration: BoxDecoration(
color: Colors.grey[200],
),
padding: EdgeInsets.all(6),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'No Images provided',
textAlign: TextAlign.center,
),
],
),
)
: Image.file(
image,
fit: BoxFit.fill,
),
onTap: () {
Navigator.of(context).pushNamed(
MyCarDetails.routeName,
arguments: id,
);
},
),
),
Container(
width: MediaQuery.of(context).size.width * 0.65,
margin: EdgeInsets.all(0),
padding: const EdgeInsets.fromLTRB(22.0, 5.0, 22.0, 0),
child: Column(
children: <Widget>[
Container(
width: double.infinity,
padding: EdgeInsets.only(
bottom: 5.8,
top: 0,
),
child: Text(
name,
)),
Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Expanded(
child: Text(
model,
),
),
Text(
currencyT + price.toStringAsFixed(1),
),
],
),
),
Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
Tab(
icon: Icon(
MyFlutterApp.km,
),
child: Text(
distanceCovered.toStringAsFixed(0) + ' KM',
),
),
Tab(
icon: Icon(
MyFlutterApp.motion_vector,
),
child: Text(
transmission,
),
),
Tab(
icon: Icon(
MyFlutterApp.fuel_type,
),
child: Text(
oilT,
),
),
Tab(
icon: Icon(
MyFlutterApp.general_model,
),
child: Text(
year,
),
),
],
),
),
],
),
),
],
),
],
),
);
}
}
这是我在我的堆栈跟踪中得到的错误:
E/flutter (29729): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: FormatException: Invalid radix-10 number (at character 1)
E/flutter (29729): listProduct
E/flutter (29729): ^
E/flutter (29729):
E/flutter (29729): #0 int._throwFormatException (dart:core-patch/integers_patch.dart:131:5)
E/flutter (29729): #1 int._parseRadix (dart:core-patch/integers_patch.dart:142:16)
E/flutter (29729): #2 int._parse (dart:core-patch/integers_patch.dart:100:12)
E/flutter (29729): #3 int.parse (dart:core-patch/integers_patch.dart:63:12)
E/flutter (29729): #4 Cars.fetchAndSetCars.<anonymous closure>
package:flutter_app/providers/car_provider.dart:107
E/flutter (29729): #5 _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:377:8)
E/flutter (29729): #6 Cars.fetchAndSetCars
package:flutter_app/providers/car_provider.dart:105
E/flutter (29729): <asynchronous suspension>
E/flutter (29729): #7 _CarAreaState.didChangeDependencies
E/flutter (29729): #8 StatefulElement._firstBuild
package:flutter/…/widgets/framework.dart:4086
E/flutter (29729): #9 ComponentElement.mount
package:flutter/…/widgets/framework.dart:3919
E/flutter (29729): #10 Element.inflateWidget
package:flutter/…/widgets/framework.dart:3101
E/flutter (29729): #11 Element.updateChild
package:flutter/…/widgets/framework.dart:2904
E/flutter (29729): #12 ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:3961
E/flutter (29729): #13 Element.rebuild
package:flutter/…/widgets/framework.dart:3738
E/flutter (29729): #14 ComponentElement._firstBuild
package:flutter/…/widgets/framework.dart:3924
E/flutter (29729): #15 ComponentElement.mount
package:flutter/…/widgets/framework.dart:3919
E/flutter (29729): #16 Element.inflateWidget
package:flutter/…/widgets/framework.dart:3101
E/flutter (29729): #17 Element.updateChild
E/flutter (29729): #18 ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:3961
E/flutter (29729): #19 Element.rebuild
package:flutter/…/widgets/framework.dart:3738
E/flutter (29729): #20 ComponentElement._firstBuild
package:flutter/…/widgets/framework.dart:3924
E/flutter (29729): #21 StatefulElement._firstBuild
package:flutter/…/widgets/framework.dart:4088
E/flutter (29729): #22 ComponentElement.mount
package:flutter/…/widgets/framework.dart:3919
E/flutter (29729): #23 Element.inflateWidget
package:flutter/…/widgets/framework.dart:3101
E/flutter (29729): #24 MultiChildRenderObjectElement.mount
package:flutter/…/widgets/framework.dart:5233
E/flutter (29729): #25 Element.inflateWidget
package:flutter/…/widgets/framework.dart:3101
E/flutter (29729): #26 Element.updateChild
package:flutter/…/widgets/framework.dart:2904
E/flutter (29729): #27 SingleChildRenderObjectElement.mount
E/flutter (29729): #28 Element.inflateWidget
package:flutter/…/widgets/framework.dart:3101
E/flutter (29729): #29 Element.updateChild
package:flutter/…/widgets/framework.dart:2904
E/flutter (29729): #30 SingleChildRenderObjectElement.mount
package:flutter/…/widgets/framework.dart:5127
E/flutter (29729): #31 Element.inflateWidget
package:flutter/…/widgets/framework.dart:3101
E/flutter (29729): #32 Element.updateChild
package:flutter/…/widgets/framework.dart:2904
E/flutter (29729): #33 ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:3961
E/flutter (29729): #34 Element.rebuild
package:flutter/…/widgets/framework.dart:3738
E/flutter (29729): #35 ComponentElement._firstBuild
package:flutter/…/widgets/framework.dart:3924
E/flutter (29729): #36 ComponentElement.mount
package:flutter/…/widgets/framework.dart:3919
E/flutter (29729): #37 Element.inflateWidget
E/flutter (29729): #38 Element.updateChild
package:flutter/…/widgets/framework.dart:2904
E/flutter (29729): #39 ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:3961
E/flutter (29729): #40 Element.rebuild
package:flutter/…/widgets/framework.dart:3738
E/flutter (29729): #41 ComponentElement._firstBuild
package:flutter/…/widgets/framework.dart:3924
E/flutter (29729): #42 ComponentElement.mount
package:flutter/…/widgets/framework.dart:3919
E/flutter (29729): #43 ParentDataElement.mount
package:flutter/…/widgets/framework.dart:4314
E/flutter (29729): #44 Element.inflateWidget
package:flutter/…/widgets/framework.dart:3101
E/flutter (29729): #45 Element.updateChild
package:flutter/…/widgets/framework.dart:2904
E/flutter (29729): #46 Componen
打印给我这个:
{listProduct: [{id: 127, Title: car -en, Date: 2019-10-31T10:03:35, Price: 25.0, category: car child 2, categoryId: 8, status: 1, brandId: 1, brand: mercedes, brandModelId: 6, brandModel: M300, kilometer: 300.0, modelYearId: 2, modelYear: 2010, fuelType: benz, carFeatureFuelId: 3, gearType: automatic, carFeatureGearId: 2, image: {path: Upload/UploadCarMain/UploadCarMain-200-200/carCar127.jpeg, name: carCar127.jpeg}, vendorId: 2}, {id: 44, Title: null, Date: 2019-10-26T09:16:23.0265211, Price: 3454.0, category: car child 1, categoryId: 7, status: 1, brandId: 2, brand: BM, brandModelId: 7, brandModel: BM X5, kilometer: 345.0, modelYearId: 2, modelYear: 2010, fuelType: dezil, carFeatureFuelId: 4, gearType: normal, carFeatureGearId: 1, image: {path: Upload/UploadCarMain/UploadCarMain-200-200/1Car44.jpg, name: 1Car44.jpg}, vendorId: 1}, {id: 43, Title: null, Date: 2019-10-25T09:40:46.4631028, Price: 25.0, category: car child 1, categoryId: 7, status: 1, brandId: 1, brand: mercedes, brandModelId: 6,
打印后加载的汽车:
[{id: 127, Title: car -en, Date: 2019-10-31T10:03:35, Price: 25.0, category: car child 2, categoryId: 8, status: 1, brandId: 1, brand: mercedes, brandModelId: 6, brandModel: M300, kilometer: 300.0, modelYearId: 2, modelYear: 2010, fuelType: benz, carFeatureFuelId: 3, gearType: automatic, carFeatureGearId: 2, image: {path: Upload/UploadCarMain/UploadCarMain-200-200/carCar127.jpeg, name: carCar127.jpeg}, vendorId: 2}, {id: 44, Title: null, Date: 2019-10-26T09:16:23.0265211, Price: 3454.0, category: car child 1, categoryId: 7, status: 1, brandId: 2, brand: BM, brandModelId: 7, brandModel: BM X5, kilometer: 345.0, modelYearId: 2, modelYear: 2010, fuelType: dezil, carFeatureFuelId: 4, gearType: normal, carFeatureGearId: 1, image: {path: Upload/UploadCarMain/UploadCarMain-200-200/1Car44.jpg, name: 1Car44.jpg}, vendorId: 1}, {id: 43, Title: null, Date: 2019-10-25T09:40:46.4631028, Price: 25.0, category: car child 1, categoryId: 7, status: 1, brandId: 1, brand: mercedes, brandModelId: 6, brandModel
最佳答案
首先,您必须由此访问listProduct
。
final response = await http.get(url);
final extractedData = json.decode(response.body);
List loadedCars = extractedData['listProduct'];
for(var i in loadedCars) {
_cars.add(AddCar(
id: i["id"],
name: i['Title'],
currencyT: i['gearType'],
price: i['Price'],
date: i['Date'],
model: i['brandModel'],
year: i['modelYear'],
distanceCovered: i['kilometer'],
transmission: i['gearType'],
oilT: i['fuelType'],
image: File(i['image']),
));
}
这样,您将创建一个数据数组列表,并且在 View 中您必须访问
该arraylist
_cars
。希望对您有帮助。
关于arraylist - 如何创建数组列表类并在Flutter中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58705656/