如何解决'List<dynamic>' 类型不是类型 'Map<String, dynamic>' 的子类型,在 Flutter 应用程序中出现此错误
我正在尝试从我的 Strapi 数据库列表中加载数据:http://localhost:1337/products 以下是我的数据库中的一个示例数据:
[{"图片":[{"_id":"602d327fe790253a44f466e7","name":"petromax.png","alternativeText":"","caption":"","hash":"petromax_14618add72","ext":".png","mime":"image/png","size":73.87,"width":444,"height":512,"url":"/uploads/petromax_14618add72.png","formats":{"thumbnail":{"name":"thumbnail_petromax.png","hash":"thumbnail_petromax_14618add72","width ":135,"height":156,"size":30.2,"path":null,"url":"/uploads/thumbnail_petromax_14618add72.png"},"small":{"name":"small_petromax.png","hash":"small_petromax_14618add72","width":434,"height":500,"size":205.37,"path": null,"url":"/uploads/small_petromax_14618add72.png"}},"provider":"local","related":["602d3287e790253a44f466e8"],"createdAt":"2021-02-17T15.648 ","updatedAt":"2021-02-17T15:13:11.831Z","__v":0,"created_by":"60278359e1626337e009d550","updated_by":"60278359e16060359e16060359e160603535"20603535020607,"_id":"602d3287e790253a44f466e8","name":"PetroMax LPG","描述离子":"12 KG-22 毫米 || 35 KG-22 mm","Refill":800,"Cylinder":780,"createdAt":"2021-02-17T15:13:11.285Z","updatedAt":"2021-02-21T15:35:58.368 Z","created_by":{"_id":"60278359e1626337e009d550","username":null,"firstname":"DokanDar","lastname":"eComm","createdAt":"2021 -02-13T07:44:25.817Z","updatedAt":"2021-02-13T07:44:26.352Z","id":"60278359e1626337e009d550"},"id_by" ":"60278359e1626337e009d550","createdAt":"2021-02-13T07:44:25.817Z:","updatedAt" 2021-02-13T07:44:26.352Z","Price":850,"id":"602d3287e790256e84
我想显示这个 product_item.dart 页面中的每个产品:
import 'package:Flutter/material.dart';
import 'package:Flutter_ecommerce/models/app_state.dart';
import 'package:Flutter_ecommerce/models/product.dart';
import 'package:Flutter_redux/Flutter_redux.dart';
class ProductItem extends StatelessWidget {
final Product item;
ProductItem({this.item});
@override
Widget build(BuildContext context) {
final String pictureUrl = 'http://localhost:1337${item.picture['url']}';
return GridTile(
footer: GridTileBar(
title: FittedBox(
fit: BoxFit.scaleDown,alignment: Alignment.centerLeft,child: Text(item.name,style: TextStyle(fontSize: 20.0))),subtitle: Text("\$${item.price}",style: TextStyle(fontSize: 16.0)),backgroundColor: Color(0xBB000000),trailing: StoreConnector<AppState,AppState>(
converter: (store) => store.state,builder: (_,state) {
return state.user != null
? IconButton(
icon: Icon(Icons.shopping_cart),color: Colors.white,onpressed: () => print('pressed'))
: Text('');
})),child: Image.network(pictureUrl,fit: BoxFit.cover));
}
}
启动应用程序后出现以下错误:
E/Flutter (25288): [ERROR:Flutter/lib/ui/ui_dart_state.cc(184)] 未处理的异常:“List”类型不是“Map
这些是来自 actions.dart 文件的产品操作:
ThunkAction<AppState> getProductsAction = (Store<AppState> store) async {
http.Response response = await http.get('http://localhost:1337/products');
final List<dynamic> responseData = json.decode(response.body);
List<Product> products = [];
responseData.forEach((productData) {
final Product product = Product.fromJson(productData);
products.add(product);
});
store.dispatch(GetProductsAction(products));
};
class GetProductsAction {
final List<Product> _products;
List<Product> get products => this._products;
GetProductsAction(this._products);
}
这也是 product.dart 文件:
import 'package:Meta/Meta.dart';
class Product {
String id;
String name;
String description;
num price;
Map<String,dynamic> picture;
Product(
{@required this.id,@required this.name,@required this.description,@required this.price,@required this.picture});
factory Product.fromJson(Map<String,dynamic> json) {
return Product(
id: json['id'],name: json['name'],description: json['description'],price: json['price'],picture: json['picture']);
}
}
解决方法
我认为您从 Map<String,dynamic>
获得了 json.decode(response.body)
。但是您试图将它存储在 List<dynamic>
方法内的 getProductsAction()
中。您可以更改类型并进行如下检查吗?
final Map<String,dynamic> responseData = json.decode(response.body);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。