【问题标题】:Adding Multiple List Tile Items in Flutter to List将 Flutter 中的多个 List Tile 项添加到 List
【发布时间】: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 以接受文本而不是字符串吗?

标签: flutter dart


【解决方案1】:

据我所知,字符串没有键属性。 尝试这样的事情(您也可以使用 UniqueKey())来获取您的 CardItems 的密钥:

return ListTile(
  trailing: Container(
    padding: EdgeInsets.only(top: 15.0),
    child: IconButton(
      icon: Icon(Icons.add),         
      onPressed: () => model.addCartItem(
        Text("${food.name}, Calories: ${food.calories} ${food.price} din\n
          Vegan: ${food.isVegan}", 
          key:ValueKey(Food.uniqueID.toString()),
         ),
       ),
     ),
   ),
 ),

然后您需要将您的 CartItems 模型调整为 List&lt;Text&gt; _cartItems = [];List&lt;Text&gt; get cartItems =&gt; _cartItems;

这样,列表中的每个元素都有您的唯一键。您还需要在 _CartState 构建器中调整地图功能,因为现在您不再有字符串,而是文本小部件。

【讨论】:

  • 我遇到Instance member 'uniqueID' can't be accessed using static access 错误,我知道它无法访问它,因为每次的值都是随机的,我该如何解决?也不确定如何调整 _CartState 中的项目,因为它们现在是文本,抱歉,我对一般编码有点陌生,这只是练习。
  • 它不是静态的,因为它是 Food 类中的 String _uniqueID = Uuid().v4();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-20
  • 2021-01-21
  • 2018-07-17
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 2012-12-26
相关资源
最近更新 更多