我不断收到错误参数类型“列表<CartModel>”无法分配给参数类型“列表<CartItem>”

问题描述 投票:0回答:3

我是 flutter 的新手,参加了 Maximillians flutter 课程,但我一直坚持将 list 的参数传递给 list type 的参数。到目前为止,我看不出代码有什么问题。 代码

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
3个回答
1
投票

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


0
投票

兄弟你可以只使用 CartItem 而不是在你的购物车供应商中使用 CartModel, 不要使用你的 CartModel😃


0
投票

问题可能是“../providers/cart.dart”文件使用了它的专有类 CartItem。

如果您使用 lint 添加导入标头,它可能会从错误的文件中导入 CartItem 定义(正如我遇到的那样)

检查用于 CartItem 导入的标头。

© www.soinside.com 2019 - 2024. All rights reserved.