在设计提供程序设计以使应用程序混乱时遇到问题

时间:2019-11-28 03:42:24

标签: flutter dart bloc

我要更改设计的主要原因是,当我扫描一种产品然后扫描相同的产品时,我两次获得相同的产品,而同一件产品因此我基本上只需要增加产品的数量即可一个。

我以前使用过Provider,但是我仍然无法设法以正确的方式安排这些类,以使其正常工作。

首先,我尝试在Product类内制作一个ProductCard对象(扩展ChangeNotifier),并使用provider.of(上下文)并检索产品的数量。 另外,在我使用main的材料之前的ChangeNotifierProvider

我头上一团糟,我很乐意看到有人整理代码并解释其工作原理

主要

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:sally_smart/utilities/product_notifier.dart';

import 'screens/checkout_screen.dart';
import 'screens/login_screen.dart';
import 'screens/registration_screen.dart';
import 'screens/welcome_screen.dart';
import 'package:provider/provider.dart';
//void main() => runApp(Sally());

void main() {
  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
      .then((_) {
    runApp(new Sally());
  });
}

class Sally extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        theme: ThemeData.dark().copyWith(
          backgroundColor: Colors.teal,
          cardColor: Color(0xFF068194),
        ),
        initialRoute: LoginScreen.id,
        routes: {
          WelcomeScreen.id: (context) => WelcomeScreen(),
          RegistrationScreen.id: (context) => RegistrationScreen(),
          LoginScreen.id: (context) => LoginScreen(),
          CheckoutScreen.id: (context) => CheckoutScreen()
        },
      );

  }
}

ProductCard

import 'package:flutter/material.dart';
import 'package:sally_smart/utilities/constants.dart';
import 'package:sally_smart/utilities/product.dart';
import 'package:sally_smart/utilities/round_icon_button.dart';

class ProductCard extends StatefulWidget  {
  final Product prodcut;


   ProductCard(Product product);



  @override
  _ProductCardState createState() => _ProductCardState();


}

class _ProductCardState extends State<ProductCard> {
   double finalPrice;
//   static int quantity = 1;

  @override
  Widget build(BuildContext context) {
    finalPrice = widget.prodcut.quantity * widget.prodcut.productPrice;
    return Card(
      elevation: 5.0,
      child: ListTile(
        leading: Padding(
          padding: EdgeInsets.only(
            left: 2.0,
          ),
          child: Icon(
            widget.prodcut.productIcon,
            size: 35,
          ),
        ),
        title: Text(
          widget.prodcut.productName,
          style: kProductNameTextStyle,
        ),
        subtitle: Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: <Widget>[
            Container(
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: <Widget>[
                  RoundIconButton(
                      icon: Icons.add,
                      color: Colors.green,
                      function: () {
                        setState(() {
                          widget.prodcut.quantity++;
                        });
                      }),
                  Text(
                    '$widget.prodcut.quantity',
                  ),
                  RoundIconButton(
                      icon: Icons.remove,
                      color: Colors.red,
                      function: () {
                        setState(() {
                          widget.prodcut.quantity--;
                          if ( widget.prodcut.quantity == 0) {
                            widget.prodcut.quantity++;
                          }
                        });
                      }),
                ],
              ),
            ),
            Text(
              '${finalPrice.toStringAsFixed(2)} ₪',
              style: TextStyle(fontSize: 15),
            ),
          ],
        ),
      ),
    );
  }
}

产品

import 'package:flutter/cupertino.dart';

class Product extends ChangeNotifier{

   String productName;
   double productPrice;
   IconData productIcon;
   String id;
   String barCode;
   int quantity;

   Product(this.productName, this.productPrice, this.productIcon, this.id,
       this.barCode,this.quantity);





}

欢迎屏幕

import 'package:audioplayers/audio_cache.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart';
import 'package:sally_smart/screens/login_screen.dart';
import 'package:sally_smart/screens/registration_screen.dart';
import 'package:sally_smart/utilities/constants.dart';
import 'package:sally_smart/utilities/product.dart';
import 'package:sally_smart/utilities/product_card.dart';
import 'package:sally_smart/utilities/scan_button_const.dart';
import 'package:sally_smart/utilities/scan_methods.dart';
//import 'package:sally_smart/utilities/scan_pageML.dart';
//import 'package:flutter_camera_ml_vision/flutter_camera_ml_vision.dart';
//import 'package:firebase_ml_vision/firebase_ml_vision.dart';

//working version

//List<ProductCard> shoppingList = [];
final sallyDatabase = Firestore.instance;

class WelcomeScreen extends StatefulWidget {
  static const String id = 'welcome_screen';

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

class _WelcomeScreenState extends State<WelcomeScreen> {
  final _auth = FirebaseAuth.instance;

  final textEditorController = TextEditingController();
  String _scanBarcode = 'Unknown';
  String productName = 'Product Test';
  double productPrice;
  String productBarCode;
  IconData productIcon = Icons.add_shopping_cart;
  final List<ProductCard> shoppingList = [];
  int productId = 0;
  static AudioCache barcodeSound = AudioCache();

  // saves barcodes data
  List<String> data = [];

  Future<void> initPlatformState() async {
    String barcodeScanRes;
    // Platform messages may fail, so we use a try/catch PlatformException.
    try {
      barcodeScanRes =
          await FlutterBarcodeScanner.scanBarcode("#ff6666", "Cancel", true);
    } on PlatformException {
      barcodeScanRes = 'Failed to get platform version.';
    }

    // If the widget was removed from the tree while the asynchronous platform
    // message was in flight, we want to discard the reply rather than calling
    // setState to update our non-existent appearance.
    if (!mounted) return;

    setState(() {
      _scanBarcode = barcodeScanRes;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        backgroundColor: Color(0xFF21bacf),
        appBar: AppBar(
          elevation: 3,
          backgroundColor: Colors.black54,
          leading: Icon(
            Icons.shopping_basket,
            size: 30,
          ),
          title: Text(
            'Sally',
            textAlign: TextAlign.end,
            style: kHeaderTextStyle,
          ),
          actions: <Widget>[
            IconButton(icon: Icon(Icons.settings), onPressed: () {}),
            VerticalDivider(
              color: Color(0x8CFFFFFF),
              width: 3,
            ),
            IconButton(
                icon: Icon(Icons.power_settings_new),
                onPressed: () {
                  _auth.signOut();
                  Navigator.pushNamed(context, LoginScreen.id);
                }),
            VerticalDivider(
              color: Color(0x8CFFFFFF),
              width: 3,
            ),
            IconButton(icon: Icon(Icons.share), onPressed: () {}),
            VerticalDivider(
              color: Color(0x8CFFFFFF),
              width: 3,
            ),
//            PopupMenuButton(itemBuilder: ),
          ],
        ),
        body: Container(
          decoration: kBackgroundGradientScan,
          child: SafeArea(
            child: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: <Widget>[
                  Row(
                    mainAxisAlignment: MainAxisAlignment.end,
                    crossAxisAlignment: CrossAxisAlignment.end,
                    children: <Widget>[
                      Text(
                        'ברוכה הבאה, סאלי',
                        textAlign: TextAlign.right,
                        style: kHeaderTextStyle,
                      ),
                      Padding(
                        padding: EdgeInsets.only(top: 5, right: 15),
                        child: Hero(
                          tag: 'Sally',
                          child: CircleAvatar(
                            backgroundImage:
                                AssetImage('images/missing_avatar_F.png'),
                            maxRadius: 25,
                          ),
                        ),
                      )
                    ],
                  ),
                  Padding(
                    padding: EdgeInsets.symmetric(vertical: 3, horizontal: 15),
                    child: TextField(
                      textAlign: TextAlign.center,
                      onChanged: (value) async {
                        _scanBarcode = value;
                        productPrice = await getProductPrice(_scanBarcode);
                        productName = await getProductName(_scanBarcode);
                      },
                      decoration: kTextFieldDecoration.copyWith(
                          prefixIcon: IconButton(
                            icon: Icon(Icons.search),
                            onPressed: () {
                              _scanBarcode = '';
                              textEditorController.clear();

                              try {
                                setState(() {
                                  textEditorController.clear();
                                  //checking if a product was already scanned

                                  //adding a ProductCard to the shopping list with the ProductCard const. Works on scan

                                  shoppingList.add(ProductCard( new Product(productName, productPrice, productIcon, shoppingList.length.toString(),
                                        productBarCode, 1)));
                                });
                              } catch (e) {
                                print(e);
                              }
                            },
                          ),
//                          prefix: IconButton(
//                              icon: Icon(Icons.search),
//                              onPressed: () {
//
//                              }),
                          hintText: '...הכנס ברקוד או שם מוצר ידנית'),
                    ),
                  ),
                  DividerSally(),
                  shoppingListBuilder(),
                  DividerSally(),
                  Container(
                    child: Padding(
                      padding: EdgeInsets.only(bottom: 15.0),
                      child: Padding(
                        padding: EdgeInsets.symmetric(horizontal: 40),
                        child: Column(
                          children: <Widget>[
                            ScanMainButton(
                              iconData: Icons.flip,
                              buttonText: 'סרוק מוצר',
                              onPressed: () async {
                                //Navigator.pushNamed(context, ScanScreen.id);

                                await initPlatformState();
                                barcodeSound.play('barcode_sound.mp3');

                                //Changes the product name by referencing to the database
                                productBarCode = _scanBarcode;
                                productPrice =
                                    await getProductPrice(_scanBarcode);
                                productName =
                                    await getProductName(_scanBarcode);

                                setState(() {
                                  //checking if a product was already scanned

                                  //adding a ProductCard to the shopping list with the ProductCard const. Works on scan
                                  shoppingList.add(ProductCard( new Product(productName, productPrice, productIcon, shoppingList.length.toString(),
                                      productBarCode, 1)));
                                });
                              },
                              color: Colors.teal,
                            ),
                            ScanMainButton(
                                iconData: Icons.check,
                                buttonText: 'מעבר לתשלום',
                                color: Colors.green,
                                onPressed: () {
                                  Navigator.pushNamed(
                                      context, RegistrationScreen.id);
                                }),
                          ],
                        ),
                      ),
                    ),
                  )
                ],
              ),
            ),
          ),
        ));
  }

  Expanded shoppingListBuilder() {
    return Expanded(
        child: Container(
      color: Colors.black38,
      child: ListView.builder(
        reverse: true,
        itemCount: shoppingList.length,
        itemBuilder: (context, index) {
          ProductCard item = shoppingList[index];
          return Dismissible(
              key: Key(item.prodcut.id),
              direction: DismissDirection.startToEnd,
              onDismissed: (direction) {
                setState(() {
                  shoppingList.removeAt(index);
                });
              },
              background: Container(
                child: Icon(
                  Icons.restore_from_trash,
                  size: 40,
                ),
                margin: EdgeInsets.symmetric(vertical: 5),
                decoration: BoxDecoration(
                  gradient: LinearGradient(
                    begin: Alignment.bottomLeft,
                    end: Alignment.topRight,
                    colors: [
                      Color(0x8C650223),
                      Color(0x8CB9013E),
                    ],
                    stops: [0.1, 0.9],
                  ),
                ),
              ),
              child: item //ListTile(title: Text('${item.productName}.')),
              );
        },
      ),
    ));
  }
}

0 个答案:

没有答案