【问题标题】:I keep getting the error argument type 'List <CartModel>' can't be assigned to the parameter type 'List <CartItem>'我不断收到错误参数类型 \'List <CartModel>\' can\'t be assigned to the parameter type \'List <CartItem>\'
【发布时间】:2022-08-16 17:27:18
【问题描述】:

我是 Flutter 的新手,正在学习 Maximillians Flutter 课程,但我一直坚持将 list 的参数传递给 list 类型的参数。到目前为止,我看不出代码有什么问题。 编码

import \'package:flutter/foundation.dart\';

import \'/providers/cart_provider.dart\';
import \'package:project_2/widgets/cart_item.dart\';

class OrderItem {
  final String id;
  final double amount;
  final List<CartItem> products;
  final DateTime dateTime;

  OrderItem({
    required this.id,
    required this.amount,
    required this.products,
    required this.dateTime,
  });
}

class Orders with ChangeNotifier {
  final List<OrderItem> _orders = [];

  List<OrderItem> get orders {
    return [..._orders];
  }

  void addOrder(List<CartItem> cartProducts, double total) {
    _orders.insert(
      0,
      OrderItem(
        id: DateTime.now().toString(),
        amount: total,
        dateTime: DateTime.now(),
        products: cartProducts,
      ),
    );
    notifyListeners();
  }
}

上面的提供程序类用于出现错误的屏幕。如下所示

import \'package:flutter/material.dart\';
import \'package:provider/provider.dart\';

import \'/providers/cart_provider.dart\';
import \'package:project_2/providers/order_provider.dart\';

import \'/widgets/cart_item.dart\';

class CartScreen extends StatelessWidget {
  const CartScreen({Key? key}) : super(key: key);

  static const cartRoute = \'/Cart Screen\';

  @override
  Widget build(BuildContext context) {
    final cartvalues = Provider.of<CartProvider>(context);
    return Scaffold(
      appBar: AppBar(
        title: const Text(\'Cart Screen\'),
        elevation: 0.5,
      ),
      body: Column(
        children: <Widget>[
          Card(
            margin: const EdgeInsets.symmetric(vertical: 10, horizontal: 10),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: <Widget>[
                Container(
                  child: const Padding(
                    padding: EdgeInsets.all(20.0),
                    child: Text(
                      \'Total\',
                      style: TextStyle(fontSize: 20),
                    ),
                  ),
                ),
                Spacer(),
                Padding(
                  padding: const EdgeInsets.all(20.0),
                  child: Chip(
                    label: Text(
                        \'\\$${cartvalues.totalAmount.toStringAsFixed(2)}\',
                        style: TextStyle(fontSize: 13)),
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.all(20.0),
                  child: ElevatedButton(
                    onPressed: () {
                      Provider.of<Orders>(context, listen: false).addOrder(
                        cartvalues.items.values.toList(),
                        cartvalues.totalAmount,
                      );
                      cartvalues.clear();
                    },
                    child: Text(\'Order\'),
                  ),
                )
              ],
            ),
          ),
          SizedBox(),
          Expanded(
            child: ListView.builder(
              itemCount: cartvalues.itemCount,
              itemBuilder: (ctx, index) => CartItem(
                cartvalues.items.keys.toList()[index],
                cartvalues.items.values.toList()[index].id,
                cartvalues.items.values.toList()[index].price,
                cartvalues.items.values.toList()[index].quantity,
                cartvalues.items.values.toList()[index].title,
              ),
            ),
          )
        ],
      ),
    );
  }
}

购物车项目小部件代码也如下所示

import \'package:flutter/material.dart\';
import \'package:provider/provider.dart\';

import \'package:project_2/providers/cart_provider.dart\';

class CartItem extends StatelessWidget {
  final String productId;
  final String id;
  final double price;
  final int quantity;
  final String title;

  CartItem(
    this.productId,
    this.id,
    this.price,
    this.quantity,
    this.title,
  );
  @override
  Widget build(BuildContext context) {
    return Dismissible(
      key: ValueKey(id),
      background: Container(
        child: Icon(Icons.delete),  
        decoration: BoxDecoration(
          color: Colors.redAccent,
          borderRadius: BorderRadius.circular(4)),
        alignment: Alignment.centerRight,
        padding: EdgeInsets.only(right: 10),
        margin: EdgeInsets.symmetric(horizontal: 15, vertical: 4,)
      ),
      direction: DismissDirection.endToStart,
      onDismissed: (direction) {
        Provider.of<CartProvider>(context, listen: false).removeItem(productId);
      },
      child: Card(
        margin: EdgeInsets.symmetric(horizontal: 15, vertical: 4,),
        child: ListTile(
          leading: CircleAvatar(
            child: FittedBox(child: Padding(
              padding: const EdgeInsets.all(8.0),
              child: Text(\'\\$$price\'),
            ))
          ),
          title: Text(title),
          subtitle: Text(\'${(price * quantity).toStringAsFixed(2)}\'),
          trailing: Text(\'${quantity}x\'),
        ),
      ),
    );
  }
}

    标签: flutter dart flutter-layout flutter-provider state-management


    【解决方案1】:

    兄弟,您应该避免使用多个提供商。如果您的应用程序太大并且您可以将其拆分为两个或多个模块(部分),那么您可以使用多个提供程序。否则只需为整个应用程序声明一个类提供程序并使用它。此外,我们不对模型使用 ChangeNotifier。我在您的问题中看不到 cartProvider 类,请让我们更深入地了解您的问题。

    【讨论】:

    • 我必须分享整个代码,而且它非常大。无论如何我可以更有效地做到这一点吗?
    • @OlabanjoOlakunori 不分享整个代码,只需添加CartProvider 类代码
    • 谢谢,我已经解决了,@iliyass 评论很有帮助
    【解决方案2】:

    我遇到同样的问题。 @Olubanjo Olakunori,请帮助您解决它

    【讨论】:

      猜你喜欢
      • 2022-12-26
      • 2022-12-01
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      • 2021-10-06
      • 2021-02-02
      • 1970-01-01
      • 2019-08-31
      相关资源
      最近更新 更多