Просмотр списка.Конструктор отображает виджет более одного раза

#flutter #dart #listview

Вопрос:

У меня есть два вопроса, с которыми, я надеюсь, вы сможете мне помочь. Я создаю listview.builder для циклического просмотра моего массива объектов, и когда я зацикливаюсь и отображаю его, виджет отображается более одного раза(фото предоставлено) Я пытаюсь перебрать свои префиксы продуктов, чтобы получить цену продукта и количество и добавить их для отображения общей цены, я попробовал метод forEach, но не смог понять, как это сделать. Спасибо за вашу помощь

 class CheckOutCart extends StatefulWidget {
  const CheckOutCart({Key? key}) : super(key: key);


  @override
  State<CheckOutCart> createState() => _CheckOutCartState();
}

class _CheckOutCartState extends State<CheckOutCart> {
  late SharedPreferences sharedPrefs;
  List<String>? cart;

  // List<List<String ,int>> productsWithQuantity;
  List productsWithQuantity = [];


  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: _getPrefs(),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          // return Text(productsWithQuantity[0][1]);
          return buildContainer(productsWithQuantity);
        }
        return Center(
            child: CircularProgressIndicator()); // or some other widget
      },
    );
  }

  Future<void> _getPrefs() async {
    sharedPrefs = await SharedPreferences.getInstance();
    cart = sharedPrefs.getStringList('userCart');
    getProductsAsObj(cart);
  }



  Container buildContainer(productsWithQuantity) {
    final Random random = new Random(5);
    return Container(
      padding: EdgeInsets.symmetric(
        vertical: getProportionateScreenWidth(15),
        horizontal: getProportionateScreenWidth(30),
      ),
      decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.only(
            topLeft: Radius.circular(30), topRight: Radius.circular(30)),
        boxShadow: [
          BoxShadow(
            offset: Offset(0, -15),
            blurRadius: 20,
            color: Color(0XFFDADADA).withOpacity(0.15),
          ),
        ],
      ),
      child: SafeArea(
        child: ListView.builder(
          shrinkWrap: true,
          itemCount: productsWithQuantity.length, //length of cart
          itemBuilder: (context, index) => Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  TotalPriceField(

                    titleText: "Merchandise Subtotal:n",
                    priceText: productsWithQuantity[index][0].retail_price.toString(),
                    // priceText: productsWithQuantity.forEach((cart) => cart  = cart[index][0].retail_price).toString()
                    // "$375.5",
                  ),
                  TotalPriceField(
                    titleText: "Shipping Total:n",
                    priceText: "${random.nextInt(5)}",
                  ),
                ],
              ),
              SizedBox(
                height: getProportionateScreenHeight(20),
              ),
              TotalPriceField(
                titleText: "Total Payment:n",
                priceText: "380.5",
              ),
              SizedBox(
                height: getProportionateScreenHeight(15),
              ),
              SizedBox(
                width: getProportionateScreenWidth(290),
                child: DefaultButton(
                  text: "Check Out",
                  press: () {},
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }

  void getProductsAsObj(cart) {
    for (var i = 0; i < cart.length; i  ) {
      var item = cart[i];
      var items = item.split('-quantity-');
      var product_ = items[0];
      var quantity_ = items[1];
      print(quantity_);
      // product_ = '[' product_ ']';
      Map<String, dynamic> valueMap = json.decode(product_);
      var product_obj = Product.fromMap(valueMap);
      var itemx = [product_obj, quantity_];
      productsWithQuantity.add(itemx);
    }
  }
}
```[![Listview.builder][1]][1]


  [1]: https://i.stack.imgur.com/4wOyi.png
 

Комментарии:

1. С настройкой представления списка вы создаете «сводку заказов» один раз для каждого товара в корзине, а не один раз.

2. функция foreach здесь не проблема, я попытался удалить ее, но она все равно выдает тот же результат, что и виджет, который создается дважды или больше

3. Это не для каждого, это тот факт, что вы используете ListView.Builder для создания сводки заказов. Этот конструктор использует список и для каждого элемента в списке создает еще один виджет Сводки заказов. Если вы положите 3 товара в корзину, получите ли вы 3 резюме заказов?

4. о, хорошо, ты знаешь, какую функцию здесь лучше всего использовать ?

5. 1) Вы анализируете список и генерируете итоговые значения, которые хотите отобразить в сводке. 2) Вы передаете эти значения в виджет сводки, созданный из виджета, который вы создаете в ListView.Builder, а затем избавляетесь от ListView.Builder.