Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 在颤振中添加页面上的重复项_Flutter_Dart - Fatal编程技术网

Flutter 在颤振中添加页面上的重复项

Flutter 在颤振中添加页面上的重复项,flutter,dart,Flutter,Dart,所以我有一个我正在开发的实践应用程序,问题是当我为同一个列表平铺项目单击“添加到购物车”按钮时,它在“购物车”页面上显示错误。我明白这是为什么,列表中不允许包含相同的项目,并且它说每个项目都应该有唯一的ID,有人知道如何轻松做到这一点吗?每个代码块都位于单独的页面上 以下是购物车模型代码,是将商品添加到购物车的提供程序函数: class CartItemsModel extends ChangeNotifier { List<String> _cartItems = [];

所以我有一个我正在开发的实践应用程序,问题是当我为同一个列表平铺项目单击“添加到购物车”按钮时,它在“购物车”页面上显示错误。我明白这是为什么,列表中不允许包含相同的项目,并且它说每个项目都应该有唯一的ID,有人知道如何轻松做到这一点吗?每个代码块都位于单独的页面上

以下是购物车模型代码,是将商品添加到购物车的提供程序函数:

  class CartItemsModel extends ChangeNotifier {
  List<String> _cartItems = [];

  List<String> get cartItems => _cartItems;

  addCartItem(String item) {
    _cartItems.add(item);
    notifyListeners();
  }
这是购物车页面本身的构建器,如果我两次单击上面的按钮查看同一列表磁贴,就会显示错误(红色屏幕)

return Consumer<CartItemsModel>(
  builder: (c, model, _) => Scaffold(
在显示项目的下一页:

  class _CartState extends State<Cart> {
  @override
  Widget build(BuildContext context) {
    return Consumer<CartItemsModel>(
      builder: (c, model, _) => Scaffold(
          appBar: AppBar(
            title: Text('Cart'),
            centerTitle: true,
          ),
          body: SingleChildScrollView(
            child: Column(
              //on trailing i should have icon with clear function that will delete that item from the list
              children: model
                  .cartItems 
             
                  .map((e) => Dismissible(
                        onDismissed: (direction) {
                          setState(() {
                            model.deleteCartItem(e);
                          });
                        },
                        //ovo se vidi kada se swipuje
                        background: Container(color: Colors.white),
                       
                        key: Key(e),

                        
                        child: Card(
                          child: ListTile(
                          //it should be below in the title, so the 'e' would be that string
                            title: Text(e, style: TextStyle(fontSize: 30.0)),
                            trailing: Container(
                              padding: EdgeInsets.only(top: 15),
                              child: IconButton(
                                  icon: Icon(Icons.delete),
                                  //mozda ovo da stavim u onDismissed iz dismissible
                                  onPressed: () {
                                    setState(() {
                                      model.deleteCartItem(e);
                                    });})))))).toList()))));}}

                    
class\u CartState扩展状态{
@凌驾
小部件构建(构建上下文){
退货消费者(
建筑商:(c,模型)=>脚手架(
appBar:appBar(
标题:文本(“购物车”),
标题:对,
),
正文:SingleChildScrollView(
子:列(
//在尾部,我应该有一个带有清除功能的图标,它将从列表中删除该项目
儿童:模特
.购物车项目
.map((e)=>可驳回(
onDismissed:(方向){
设置状态(){
型号.第(e)项;
});
},
//瑞士卡达酒店
背景:容器(颜色:Colors.white),
键:键(e),
孩子:卡片(
孩子:ListTile(
//它应该在标题下面,所以“e”就是那个字符串
标题:文本(e,样式:TextStyle(fontSize:30.0)),
拖尾:集装箱(
填充:仅限边缘设置(顶部:15),
孩子:我的钮扣(
图标:图标(Icons.delete),
//mozda ovo da stavim u onDismissed iz不屑一顾
已按下:(){
设置状态(){
型号.第(e)项;
})59

由于愚蠢的声誉系统,我无法添加评论,但您似乎正在将该项目添加到一个新列表中,该列表将查看唯一ID。。由于这些项必须是唯一的,因此当您添加另一个具有相同ID的项时会出现错误。如果没有更多的代码,则会出现错误


您可能可以通过为新列表中输入的每个项目指定一个唯一的键来解决此问题。而不是从要添加的项中获取密钥。或者,在添加现有关键点的同时,对要添加的项目中的现有关键点进行小的调整。确保密钥永远不能相同。

导入“package:uuid/uuid.dart”

import 'package:uuid/uuid.dart';
将添加逻辑更改为:

model.addCartItem("${name.name}\n${name.description}${Uuid().v4()}")

我也是这么想的。知道如何简单地实现它吗?Teddhiiwa给出的答案很好。上面的答案是,尽管是基本的。代码的最后一部分:Uuid().v4()添加了一个唯一的ID://生成一个v4(随机)ID Uuid.v4();//->'110ec58a-a0f2-4ac4-8393-c866d813b8d1'这将始终是不同的。因此,我的猜测是,当你将物品添加到你的卡中时,改变你的身份识别码,并将其更改为该代码。就我个人而言,我会在我的类中添加一个字符串uniqueID,当我将该项添加到卡中时,使用为其生成的唯一代码。这确实有效,但是,它会显示一个丑陋的UUID字符串。有没有办法使它不可见,但仍然注册为唯一的字符串?也许向类中添加字符串会像您提到的那个样起作用。若您想正确地添加项,那个么您应该在模型中使用标识符。现在,您正在添加带有字符串标识符的项:model.addCartItem(${name.name}\n${name.description}),因此它将显示为字符串,并且很难看,是的。您可能需要重建它,但因为我不知道您到底在做什么,所以无法进一步迭代。你只是在保存字符串吗?还是一个物体?它要去哪里?只是一个列表还是数据库?或者firestore?这里的线程可能会解释得更详细一点,我确实需要能够添加每一项任意多次,而不会出现重复的键:有没有可能像这样添加uuid而不会在代码中可见?我一直在努力使它工作,但我似乎无法理解,它确实与上面的代码一起工作,但显示了丑陋的uuid字符串。嗨@arbiter,有一种方法可以“隐藏”uuid字符串。UUIDV4字符串基本上是一个36个字符的字符串。因此,当您想要显示不带难看字符串的购物车项目时,必须通过以下函数对其进行子字符串:cartItemWithUuid.substring(cartItemWithUuid.length-36,cartItemWithUuid.length);我不确定我是否理解,你能给我完整的代码吗?多谢各位!我已经为此挣扎了好几天了,虽然这可能很简单,但我不知道怎么做。唯一的问题是我不想最后出现“重复键”错误,有没有办法用这段代码来解决这个问题?事实上,在你们的帮助下,特别是在这个特殊问题上@TEDDICIIWA,我设法通过删除Uuid的最后36个数字和字母来“修复”它:`title:Text(e.substring(0,e.length-36),`这似乎就完成了任务。
import 'package:uuid/uuid.dart';
model.addCartItem("${name.name}\n${name.description}${Uuid().v4()}")