arraylist - 如何在颤动中创建一类数组列表并获取数据
问题描述
我正在尝试将类提供程序构建为数组列表,以便从 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
print 给了我这个:
{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']),
));
}
这样,您将创建一个数据数组列表,并且在视图中您必须访问该数组列表_cars
。
希望它会帮助你。
推荐阅读
- r - 在一个函数中运行多个回归
- unity3d - 从点列表构建索引缓冲区
- aws-java-sdk - AWS Java SDK 按配置文件调用
- react-native - 反应原生状态
- java - Java - 如何使用 JSoup 访问 Div 的子级
- javascript - 使用带有上下文/变量的 javascript 创建 HTML
- c# - 如何在 ComboBox 中添加自定义索引
- javascript - google drive api - 列出应用程序中与我共享的文件,仅对应用程序创建的文件具有读写权限(权限 auth/drive.file)
- python - attrs.asdict() 中的列表类型缺少 dunders?
- ios - 访问谷歌地图中的当前位置