#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.