【问题标题】:How to make the price shown adjust according to selected items?如何使显示的价格根据所选项目进行调整?
【发布时间】:2021-07-25 05:14:04
【问题描述】:

这是咖啡订购页面, 我希望显示的价格根据所选尺寸和配料进行调整。我对此很陌生。请通过示例教我如何做到这一点。

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:selfordering1/models/addon.dart';
import 'package:selfordering1/models/models.dart';

class Americano extends StatefulWidget {

  @override
  _AmericanoState createState() => _AmericanoState();
}

class _AmericanoState extends State<Americano> {
  List<Products> beverages = [];
  List<addonsize> listSize = [
    addonsize(
      id: 7,
      size: 'Tall',
      price: 0,
    ),
    addonsize(
      id: 8,
      size: 'Grande',
      price: 30,
    ),
    addonsize(
      id: 9,
      size: 'Venti',
      price: 50,
    ),
  ];
  List<addontopping> listTopping = [
    addontopping(
      id: 8,
      topping: 'Whipcream',
      price: 0,
      isCheck: true,
    ),
    addontopping(
      id: 9,
      topping: 'Javachip',
      price: 30,
      isCheck: false,
    ),
    addontopping(
      id: 10,
      topping: 'SoyMilk',
      price: 20,
      isCheck: false,
    ),
    addontopping(
      id: 11,
      topping: 'ExtraSyrup',
      price: 30,
      isCheck: false,
    ),
  ];
  var items = Products().beverages;

  bool _value = false;

  @override
  var _size;


  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(''),
        leading: IconButton(
          icon: Icon(Icons.arrow_back, color: Colors.white),
          onPressed: () {
            Navigator.pop(context);
          },
        ),
        backgroundColor: Colors.transparent,
        elevation: 0.0,
      ),
      extendBodyBehindAppBar: true,
      body: Container(
        decoration: BoxDecoration(
          image: DecorationImage(
            image: AssetImage('assets/lightwood.jpg'),
            fit: BoxFit.fill,
          ),
        ),
        child: ListView(
          padding: const EdgeInsets.all(100),
          children: <Widget>[
            Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                Container(
                  width: 200,
                  height: 200,
                  decoration: BoxDecoration(
                    image: DecorationImage(
                      image: AssetImage(items[1].img),
                    ),
                  ),
                ),
                Text(
                  items[1].name,
                  style: TextStyle(
                      fontWeight: FontWeight.bold,
                      fontSize: 30,
                      color: Colors.brown),
                ),
                Container(
                  margin: EdgeInsets.all(50),
                  child: Text(
                    items[1].price.toStringAsFixed(0) + ' บาท',
                    style: TextStyle(
                        fontWeight: FontWeight.bold,
                        fontSize: 30,
                        color: Colors.brown),
                  ),
                ),
              ],
            ),
            Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                ListView.builder(
                    shrinkWrap: true,
                    itemCount: listTopping.length,
                    itemBuilder: (BuildContext context, int i) {
                      return new Card(
                        child: new Container(
                          padding: new EdgeInsets.all(10.0),
                          child: Column(
                            children: <Widget>[
                              new CheckboxListTile(
                                activeColor: Colors.blue,
                                dense: true,
                                //font change
                                title: new Text(
                                  listTopping[i].price.toStringAsFixed(0) +
                                      ' บาท',
                                  style: TextStyle(
                                    fontSize: 25,
                                    fontWeight: FontWeight.bold,
                                  ),
                                ),
                                value: listTopping[i].isCheck,
                                secondary: Container(
                                  height: 50,
                                  width: 300,
                                  child: Text(
                                    listTopping[i].topping,
                                    style: TextStyle(
                                      fontSize: 25,
                                      fontWeight: FontWeight.bold,
                                    ),
                                  ),
                                ),
                                onChanged: (bool? val) {
                                  itemChange(val!, i);
                                },
                              ),
                            ],
                          ),
                        ),
                      );
                    }),
              ],
            ),
            Container(
              width: MediaQuery.of(context).size.width,
              height: MediaQuery.of(context).size.height,
              child: Column(
                children: [
                  ListView.builder(
                    shrinkWrap: true,
                    itemCount: listSize.length,
                    itemBuilder: (BuildContext context, int i) {
                      return new Card(
                        child: new Container(
                          padding: new EdgeInsets.all(10.0),
                          child: Column(
                            children: <Widget>[
                              RadioListTile(
                                  title: Text(listSize[i].size),
                                  subtitle: Text(
                                      listSize[i].price.toStringAsFixed(0) +
                                          ' บาท',
                                    style: TextStyle(
                                      fontSize: 25,
                                      fontWeight: FontWeight.bold, color: Colors.black,
                                    ),),
                                  value: listSize[i].price,
                                  groupValue: _size,
                                  onChanged: (value) {
                                    setState(() {
                                      _size = value;
                                    });
                                  }),
                            ],
                          ),
                        ),
                      );
                    },
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }

  void itemChange(bool val, int i) {
    setState(() {
      listTopping[i].isCheck = val;
    });
  }
}

double calculatePrice() {
  if (listTopping.isNotEmpty) {
    var _price;
    // Get those toppings that are chosen (`isCheck` is true)
    final chosenTopping = listTopping.where((element) => element.isCheck);

    // Calculate the sum
    for (var item in chosenTopping) {
      _price += item.price;
    }
    return _price;
  }
  return 0.0;
}

这是该页面中的所有代码, 如果需要更多信息,请告诉我。

由于代码calculatePrice()在底部,有人好心告诉我,但我仍然不知道如何实现它T_T请帮助!!

【问题讨论】:

    标签: list flutter shopping-cart selecteditem price


    【解决方案1】:
    double calculatePrice() {
      var _price = 0.0;
      for (var item in chosenTopping) {
        if(item.isCheck){
           _price += item.price;
        }
      }
      return _price;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-17
      • 2022-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      相关资源
      最近更新 更多