我正在尝试计算商品清单的总价

时间:2020-06-17 09:29:07

标签: flutter dart

我正在制作一个购物车应用程序,我想在其中计算购物车中产品的总价,我为此创建了一个函数,并尝试在init状态下执行,但无法正常工作

import 'package:flutter/material.dart';
import 'package:shop/Models/Database.dart';

class Cart extends StatefulWidget {
  @override
  _CartState createState() => _CartState();
}

class _CartState extends State<Cart> {

  int sum = 0;

  total() {
    studlist.forEach((element) {
      sum = sum + element.price;
    });
  }

  @override
  void initState() {
    total();
    super.initState();
  }

  final DbStudentManager dbmanager = new DbStudentManager();

  Student cart;
  List<Cart> cartList;
  int updateIndex;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.white,
        title: Text(
          'Cart',
          style: TextStyle(color: Colors.black),
        ),
      ),
      body: FutureBuilder(
          future: dbmanager.getStudentList(),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              studlist = snapshot.data;
            }
            return ListView.builder(
                itemCount: studlist == null ? 0 : studlist.length,
                itemBuilder: (BuildContext context, int index) {
                  Student ct = studlist[index];
                  return Card(
                    child: ListTile(
                      title: Text(ct.name),
                      subtitle: Text('${ct.price}'),
                      trailing: IconButton(
                          icon: Icon(Icons.delete),
                          onPressed: () {
                            dbmanager.deleteStudent(ct.id);
                            setState(() {
                              studlist.remove(index);
                            });
                          }),
                    ),
                  );
                });
          }),
      bottomNavigationBar: Row(
        children: <Widget>[
          Container(
            padding: EdgeInsets.all(10),
            child: Row(
              children: <Widget>[
                Text('$sum'),
                SizedBox(
                  width: 10,
                ),
                Text('Check Out'),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

我得到的错误:

方法“ forEach”在null上被调用。 接收者:null 尝试调用:forEach(结束语:(学生)=>空)

3 个答案:

答案 0 :(得分:0)

尝试一下:

import 'package:flutter/material.dart';
import 'package:shop/Models/Database.dart';

class Cart extends StatefulWidget {
  @override
  _CartState createState() => _CartState();
}

class _CartState extends State<Cart> {

  int sum = 0;



  @override
  void initState() {
    super.initState();
  }

  final DbStudentManager dbmanager = new DbStudentManager();

  Student cart;
  List<Cart> studList=[];
  int updateIndex;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.white,
        title: Text(
          'Cart',
          style: TextStyle(color: Colors.black),
        ),
      ),
      body: FutureBuilder(
          future: dbmanager.getStudentList(),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              studlist = snapshot.data;
             studlist.forEach((element) {
           setState((){

             sum = sum + element.price;

           });

    });
            }
            return ListView.builder(
                itemCount: studlist == null ? 0 : studlist.length,
                itemBuilder: (BuildContext context, int index) {
                  Student ct = studlist[index];
                  return Card(
                    child: ListTile(
                      title: Text(ct.name),
                      subtitle: Text('${ct.price}'),
                      trailing: IconButton(
                          icon: Icon(Icons.delete),
                          onPressed: () {
                            dbmanager.deleteStudent(ct.id);
                            setState(() {
                              studlist.remove(index);
                            });
                          }),
                    ),
                  );
                });
          }),
      bottomNavigationBar: Row(
        children: <Widget>[
          Container(
            padding: EdgeInsets.all(10),
            child: Row(
              children: <Widget>[
                Text('$sum'),
                SizedBox(
                  width: 10,
                ),
                Text('Check Out'),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

答案 1 :(得分:0)

如果在加载数据时而不是在init中尝试运行total()函数。由于数据最初是空的,因此在init中运行它会导致此错误。

if (snapshot.hasData) {
   studlist = snapshot.data;
   total();
}

完整代码:

import 'package:flutter/material.dart';
import 'package:shop/Models/Database.dart';

class Cart extends StatefulWidget {
  @override
  _CartState createState() => _CartState();
}

class _CartState extends State<Cart> {

  int sum = 0;

  total() {
    studlist.forEach((element) {
      sum = sum + element.price;
    });
  }

  final DbStudentManager dbmanager = new DbStudentManager();

  Student cart;
  List<Cart> cartList;
  int updateIndex;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.white,
        title: Text(
          'Cart',
          style: TextStyle(color: Colors.black),
        ),
      ),
      body: FutureBuilder(
          future: dbmanager.getStudentList(),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              studlist = snapshot.data;
              total(); //Run the total() function here
            }
            return ListView.builder(
                itemCount: studlist == null ? 0 : studlist.length,
                itemBuilder: (BuildContext context, int index) {
                  Student ct = studlist[index];
                  return Card(
                    child: ListTile(
                      title: Text(ct.name),
                      subtitle: Text('${ct.price}'),
                      trailing: IconButton(
                          icon: Icon(Icons.delete),
                          onPressed: () {
                            dbmanager.deleteStudent(ct.id);
                            setState(() {
                              studlist.remove(index);
                            });
                          }),
                    ),
                  );
                });
          }),
      bottomNavigationBar: Row(
        children: <Widget>[
          Container(
            padding: EdgeInsets.all(10),
            child: Row(
              children: <Widget>[
                Text('$sum'),
                SizedBox(
                  width: 10,
                ),
                Text('Check Out'),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

答案 2 :(得分:-1)

try this 
If I added Quantity increased totalQty but I have one issue if I removing Item in list
did not decrease. sorry my english not good  

  `total() {

    studlist.forEach((element) {
      if(element.qty!=null){
        totalQty=totalQty+element.qty;
        print(totalQty);
      }
    });
  }
`