“String”类型不是 Flutter 中“Item”类型的子类型
Posted
技术标签:
【中文标题】“String”类型不是 Flutter 中“Item”类型的子类型【英文标题】:type 'String' is not a subtype of type 'Item' in Flutter 【发布时间】:2020-08-01 18:37:51 【问题描述】:我使用提供包(状态管理)创建了一个购物车应用程序,用于在购物车页面中存储选定的商品或产品,但问题是我收到“类型‘字符串’不是‘项目’类型的子类型的错误”。下面是 dart 代码和模型,如果我尝试从主页单击任何项目,则它将所选项目存储在购物车页面中,如果我尝试从第二页(数量页面)存储项目,则会出现错误。
HomePage.dart
class Home extends StatefulWidget
@override
_HomeState createState() => _HomeState();
class _HomeState extends State<Home>
List<Item> _product=[
Item(
title: "Cake",
image: "assets/1.png",
price: 20.00,
),
Item(
title: "Pasteries",
image: "assets/2.png",
price: 30.00,
),];
@override
Widget build(BuildContext context)
return Consumer<Cart>(
builder: (context,cart,child)
return PlatformScaffold(
body: ListView.builder(
itemCount: _product.length,
itemBuilder: (BuildContext context, int index)
return Padding(
padding: const EdgeInsets.only(
top: 35.0, bottom: 15.0, left: 20.0, right: 20.0),
child: GestureDetector(
onTap: ()
//cart.add(_product[index]);//Here i try to select the item and it successfully stored in cart page
Navigator.of(context).push(MaterialPageRoute(builder: (context) => Quantities(
productname: _product[index].title,
productprice: _product[index].price,
productimage: _product[index].image,
)));,
child: Container(
child: new FittedBox(
child: Material(
color: Colors.white,
elevation: 15.0,
borderRadius: BorderRadius.circular(15.0),
shadowColor: Color(0x802196F3),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
width: 250,
height: 200,
child: ClipRRect(
borderRadius: new BorderRadius.circular(15.0),
child: new Image.asset(
_product[index].image,
fit: BoxFit.cover,),),),
Padding(
padding: const EdgeInsets.only(top: 5.0,bottom: 5.0),
child: Text(_product[index].title,style: TextStyle(color: Colors.blueGrey[700],
fontWeight: FontWeight.bold,fontSize: 18.0),),
),],)),),),),);));,);
数量.dart
class Quantities extends StatefulWidget
var productprice;
String productimage;
final productname;
Quantities(this.productprice, this.productimage, this.productname);
@override
_QuantitiesState createState() => _QuantitiesState(productprice,productimage,productname);
class _QuantitiesState extends State<Quantities>
final productprice;
final productimage;
final productname;
_QuantitiesState(this.productprice, this.productimage, this.productname);
@override
Widget build(BuildContext context)
return Consumer<Cart>(
builder: (context,cart,child)
return PlatformScaffold(
appBar: PlatformAppBar(
backgroundColor: Colors.lightBlue[900],
title: Text('Details'),),
body: ListView(
children: <Widget>[
Padding(
padding: const EdgeInsets.only(top: 20.0),
child: Container(
child: Column(
children: <Widget>[
Container(
height: 150.0,
child: GridTile(
child: Container(
color: Colors.white,
child: Image.asset(productimage),),),),
Text(productname,style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20.0),),
Text("Price: "+productprice.toString()+" SAR",style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20.0),),
Padding(
padding: const EdgeInsets.only(top: 20.0),
child: Center(
child: PlatformButton(
onPressed: ()
cart.add(productname);,// Here i am getting an error
child: Text('Add to Cart',style: TextStyle(color: Colors.white),),
androidFlat: (_) => MaterialFlatButtonData(
color: Colors.cyan),
ios: (_) => CupertinoButtonData(
color: Colors.cyan
)),),),],),),),],),);,);
CartPage.dart
class CartPage extends StatefulWidget
@override
State<StatefulWidget> createState()
return _CartPageState();
class _CartPageState extends State<CartPage>
@override
Widget build(BuildContext context)
return Consumer<Cart>(
builder: (context,cart,child)
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.indigo,
title: Text("Cart"),),
body: cart.basketItems.length==0
?Text("no items"):ListView.builder(
itemCount: cart.basketItems.length,
itemBuilder: (context,index)
return Card(
child: ListTile(
title: Text(cart.basketItems[index].title),),);),);,);
cartmodel.dart
class Item
String title;
String image;
double price;
Item(this.title, this.price,this.image);
购物车.dart
class Cart extends ChangeNotifier
List<Item> _items = [];
double _totalPrice = 0.0;
void add(Item item)
_items.add(item);
_totalPrice += item.price;
notifyListeners();
void remove(Item item)
_totalPrice -= item.price;
_items.remove(item);
notifyListeners();
int get count
return _items.length;
double get totalPrice
return _totalPrice;
List<Item> get basketItems
return _items;
【问题讨论】:
错误到底发生在哪里? @FPerroch 在数量页面onPressed: () cart.add(productname);,
【参考方案1】:
您收到此错误是因为您的add
方法表单Cart
类正在等待Item
对象,而您传递了productname
,它是一个字符串。
从您的代码中,您需要从您的 Quantities
小部件构建一个新的 Item
,如下所示:
cart.add(Item(title: productname, image: productimage, price : productprice));
但是如果你想改进你的代码,你可以用你的Item
对象替换你的Quantities
类上的这三个属性。您可以先将您的班级转换为StatelessWidget
:
class Quantities extends StatelessWidget
final Item item;
Quantities(this.item);
@override
Widget build()
...
通常,您应该在可能的方法/小部件上使用 Item
对象
【讨论】:
@F Perroch 那么如何解决这个问题。 @F Perroch 能否提供改进的示例代码以上是关于“String”类型不是 Flutter 中“Item”类型的子类型的主要内容,如果未能解决你的问题,请参考以下文章
Flutter [错误:flutter/lib/ui/ui_dart_state.cc(177)] 未处理的异常:类型“int”不是类型转换中“String”类型的子类型
未处理的异常:类型“int”不是 Flutter 应用程序中“String”类型的子类型
Flutter fromJson - 未处理的错误未处理的错误类型'String'不是'int'类型的子类型发生在实例中
Flutter 错误:类型 '(String, ItemPriority) => void' 不是类型 '(String, [ItemPriority]) => dynamic' 的子类型
Flutter 错误:“Null”类型不是“String”类型的子类型
未处理的异常:类型“List<dynamic>”不是 dart/flutter 中“Map<String, dynamic>”类型的子类型