“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>”类型的子类型