flutter - 输入'列表' 不是类型 'Map 的子类型' 在颤振应用程序中出现此错误
问题描述
我正在尝试从我的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","格式":{"thumbnail":{"name":"thumbnail_petromax.png","hash":"thumbnail_petromax_14618add72","ext":".png","mime":"image/png","width":135 ,"高度":156,"尺寸":30.2,"路径":null,"url":"/uploads/thumbnail_petromax_14618add72.png"},"小":{"名称":"small_petromax.png","hash":"small_petromax_14618add72","ext":".png","mime":"image/png","width":434,"height":500,"size ":205.37,"path":null,"url":"/uploads/small_petromax_14618add72.png"}},"provider":"local","related":["602d3287e790253a44f466e8"],"createdAt":"2021- 02-17T15:13:03.648Z","updatedAt":"2021-02-17T15:13:11.831Z","__v":0,"created_by":"60278359e1626337e009d550","updated_by":"60278359e1626337e009d550"," id":"602d327fe790253a44f466e7"}],"_id":"602d3287e790253a44f466e8","name":"PetroMax LPG","description":"12 KG-22 mm || 35 KG-22 mm","Refill":800,"Cylinder":780,"createdAt":"2021-02-17T15:13:11.285Z","updatedAt":"2021 -02-21T15:35:58.368Z","__v":0,"created_by":{"_id":"60278359e1626337e009d550","username":null,"firstname":"DokanDar","lastname":"eComm ","createdAt":"2021-02-13T07:44:25.817Z","updatedAt":"2021-02-13T07:44:26.352Z","__v":0,"id":"60278359e1626337e009d550"} ,"updated_by":{"_id":"60278359e1626337e009d550","username":null,"firstname":"DokanDar","lastname":"eComm","createdAt":"2021-02-13T07:44:25.817 Z","updatedAt":"2021-02-13T07:44:26.352Z","__v":0,"id":"60278359e1626337e009d550"},"Price":850,"id":"602d3287e790253a44f466e8"},
我想在这个 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<String, dynamic>”类型的子类型 E/flutter (25288) : #0 new Product.fromJson (package:flutter_ecommerce/models/product.dart:23:22) E/flutter (25288): #1 getProductsAction.. (package:flutter_ecommerce/redux/actions.dart:33:37) E /flutter (25288): #2 List.forEach (dart:core-patch/growable_array.dart:403:8) E/flutter (25288): #3 getProductsAction。(包:flutter_ecommerce/redux/actions.dart:32:16)
这些是 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);
推荐阅读
- java - 如何在 SQLite 中获取 BigDemic?
- javascript - JavaScript 数字和字符串声明
- php - 为什么 SQL 期望参数是整数和 mysqli?
- java - JSF Web 应用程序无法在部署中运行,但可以在本地运行
- python - Kivy 布局无法正确显示按钮
- javascript - 如何将 html2pdf 连接到 nodemailer
- android - 使用 Android BLE 时出现错误“E/bt_btif:... ignore HID...”
- java - 使用 JSONPath 的 MockMVC 无法读取
- javascript - 动态内容的反应状态
- r - 我在 ggplot2 上的热图没有显示部分数据,但 data.frame 似乎很好