【发布时间】:2021-03-12 06:22:09
【问题描述】:
我的代码无法正常工作。我有一个 Food 类,并在上面初始化了名称、价格和唯一 ID 字符串。我将唯一 ID 设为 Uuid().v4(),这将为每个食物项目提供一个随机字符串。
食品类
class Food {
String name;
String price;
String uniqueID = Uuid().v4();
Food({this.name,
this.price,
this.uniqueID})}
在另一个页面上,我有一个 Provider 函数可以在购物车中添加项目,它是一个字符串项目列表(这可能不是最佳选择)。这是它的代码:
class CartItemsModel extends ChangeNotifier {
List<String> _cartItems = [];
List<String> get cartItems => _cartItems;
addCartItem(String item) {
_cartItems.add(item);
notifyListeners();
}
现在,在另一个页面上,我正在调用要添加到购物车的食物,它是一个带有 onPressed 上述功能的图标:
return ListTile(
trailing: Container(
padding:
EdgeInsets.only(top: 15.0),
child: IconButton(
icon: Icon(Icons.add),
onPressed: () =>
model.addCartItem(
"${food.name}, Calories: ${food.calories} ${food.price} din\nVegan: ${food.isVegan}, ${Uuid().v4()}")),
现在,您看到我在那里有 Uuid(没有我在 Food 类中的 uniqueID,因为由于某种原因它不起作用)。我有 Uuid,因此如果单击按钮两次,则不会出现多个重复项的错误,这是没有它的错误:
问题是它可以工作并且可以正常工作,但是我在最终的“购物车”窗口上显示的 Uuid 中有这个丑陋的 ID。基本上我希望这个 ID 是不可见的。这是它的外观:
这是“购物车”屏幕的代码:
class _CartState extends State<Cart> {
@override
Widget build(BuildContext context) {
return Consumer<CartItemsModel>(
builder: (c, model, _) => Scaffold(
body: SingleChildScrollView(
child: Column(
//on trailing i should have icon with clear function that will delete that item from the list
children: model
.cartItems //maybe below can return ListView.separated like on the food list user, we'll see
.map((e) =>
所以长话短说,这里没有使用我的 uniqueID,因为由于某种原因,它不会使每个列表磁贴项目的键都是唯一的,因此在单击两次时它不会显示并给我错误,这就是我暂时使用 Uuid 技巧的原因。
我想要的是让它完全像这样工作,但看不到丑陋的 Uuid 字符串。有没有简单的我可以用它做的事情,也许可以在 CartItemsModel 代码中添加一些东西、条件或其他东西?
如果我将 onPressed 中的代码更改为:
onPressed: () {
if (!model.cartItems
.contains(food)) {
model.addCartItem(Food);
}
}
我收到错误:
The argument type 'Type' can't be assigned to the parameter type 'String
是否有一个简单的解决方案可以轻松地将项目添加到“购物车”屏幕,无论我点击同一个项目多少次,只需将每个项目作为一个单独的列表磁贴在购物车屏幕中?
更新错误
当我更改这些文件时,我会在不同的文件中收到这些错误,即使我将所有内容的值都更改为 Text。
【问题讨论】:
-
如果有人需要,我可以发布完整的代码,我真的需要解决这个问题,我尝试了很多不同的方法,不知道如何轻松解决。
-
您是否还在 ListTile 小部件中设置 Key 属性?
-
顺便说一句,正确格式化您的代码有助于其他人更快地阅读和理解它。
-
在您的更新中,您没有按照我在回答中提出的建议将字符串包装到
Text小部件中。此外,如果ValueKey不想工作,请尝试使用UniqueKey()。 -
谢谢,总的来说,我对编码还很陌生,所以有点混乱,但我越来越理解它了。知道如何更改 _CartState 以接受文本而不是字符串吗?