मैं अपने स्पंदन एप्लिकेशन में बुनियादी खरीदारी कार्यों का निर्माण करने के लिए काम कर रहा हूँ। मैं कोडिंग और स्पंदन के लिए नया हूँ। जब उपयोगकर्ता AddOrderDetails() विधि को चेक आउट करने की पुष्टि करने के लिए PlaceOrderPageContainer (बटन) पर क्लिक करता है, जो तब फायरबेस डेटाबेस को अपडेट करता है। शॉपिंग कार्ट में कुल राशि की परवाह किए बिना शून्य के रूप में जोड़ी जा रही कुल राशि के अलावा सब कुछ फायरस्टोर डेटाबेस में सही ढंग से अपडेट हो रहा है। मुझे कंसोल में कोई त्रुटि नहीं मिल रही है लेकिन यह स्पष्ट है कि मेरा कोड सही ढंग से नहीं लिखा गया है। किसी भी प्रकार की सहायता सराहनीय होगी। अगर यह मददगार होगा तो मैं कोई अतिरिक्त कोड जोड़ सकता हूं।

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

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

class _ShoppingCartPageState extends State<ShoppingCartPage> {
  late double totalAmount;

  @override
  void initState() {
    super.initState();
    totalAmount = 0;
    Provider.of<TotalAmountProvider>(
      context,
      listen: false,
    ).display(0);
  }

  @override
  Widget build(BuildContext context) {
    return Consumer2<TotalAmountProvider, CartItemCounterProvider>(
      builder: (context, amountProvider, cartProvider, c) {
        return SafeArea(
          child: Scaffold(
            appBar: const ShoppingCartAppBar(),
            floatingActionButton: FloatingActionButton.extended(
              onPressed: () {
                if (ShoppingApp.sharedPreferences
                        .getStringList(
                          ShoppingApp.userCartList,
                        )
                        ?.length ==
                    1) {
                  Fluttertoast.showToast(msg: ToastString.cartEmpty);
                } else {
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) => AddressPage(
                        totalAmount: totalAmount,
                      ),
                    ),
                  );
                }
              },
              icon: const Icon(
                Icons.navigate_next,
              ),
              label: Text(
                ButtonString.checkOut.toUpperCase(),
              ),
            ),
            body: CustomScrollView(
              slivers: [
                SliverToBoxAdapter(
                  child:
                      Consumer2<TotalAmountProvider, CartItemCounterProvider>(
                    builder: (context, amountProvider, cartProvider, c) {
                      return Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: Center(
                          child: cartProvider.count == 0
                              ? Container()
                              : Text(
                                  'Total Price: \$${amountProvider.totalAmount.toString()}',
                                  style: Theme.of(context).textTheme.headline6,
                                ),
                        ),
                      );
                    },
                  ),
                ),
                StreamBuilder<QuerySnapshot>(
                    stream: ShoppingApp.firestore
                        .collection('items')
                        .where('shortInfo',
                            whereIn: ShoppingApp.sharedPreferences
                                .getStringList(ShoppingApp.userCartList))
                        .snapshots(),
                    builder: (context, AsyncSnapshot snapshot) {
                      return !snapshot.hasData
                          ? const AdaptiveCircularProgressSliver()
                          : snapshot.data.docs.isEmpty
                              ? const EmptyShoppingCartContainer()
                              : SliverList(
                                  delegate: SliverChildBuilderDelegate(
                                    (context, index) {
                                      ItemModel model = ItemModel.fromJson(
                                        snapshot.data.docs[index].data(),
                                      );
                                      if (index == 0) {
                                        totalAmount = 0;
                                        // totalAmount = model.price! + totalAmount;
                                      } else {
                                        totalAmount =
                                            model.price! + totalAmount;
                                      }
                                      if (snapshot.data?.docs.length - 1 ==
                                          index) {
                                        WidgetsBinding.instance!
                                            .addPostFrameCallback((timeStamp) {
                                          Provider.of<TotalAmountProvider>(
                                                  context,
                                                  listen: false)
                                              .display(totalAmount);
                                        });
                                      }
                                      return sourceInfo(
                                        model,
                                        context,
                                        removeCartFunction: () =>
                                            removeItemFromUserCart(
                                          model.shortInfo as String,
                                        ),
                                      );
                                    },
                                    childCount: snapshot.hasData
                                        ? snapshot.data?.docs.length
                                        : 0,
                                  ),
                                );
                    }),
              ],
            ),
          ),
        );
      },
    );
  }

  Future<void> removeItemFromUserCart(
    String shortInfoAsID,
  ) async {
    List<String>? tempCartList = ShoppingApp.sharedPreferences.getStringList(
      ShoppingApp.userCartList,
    );
    tempCartList?.remove(shortInfoAsID);

    await ShoppingApp.firestore
        .collection(ShoppingApp.collectionUser)
        .doc(ShoppingApp.sharedPreferences.getString(
          ShoppingApp.userUID,
        ))
        .update({
      ShoppingApp.userCartList: tempCartList,
    }).then((value) {
      Fluttertoast.showToast(
        msg: ToastString.removeFromCart,
      );
      ShoppingApp.sharedPreferences.setStringList(
        ShoppingApp.userCartList,
        tempCartList as List<String>,
      );

      Provider.of<CartItemCounterProvider>(
        context,
        listen: false,
      ).displayResult();

      totalAmount = 0;
    });
  }
}

class AddressPage extends StatefulWidget {
  const AddressPage({
    Key? key,
    required this.totalAmount,
  }) : super(key: key);

  final double totalAmount;

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

class _AddressPageState extends State<AddressPage> {
  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: AdaptiveLayoutScaffold(
        appBar: const AddressPageAppBar(),
        floatingActionButton: const AddNewAddressFAB(),
        landscapeBodyWidget: Container(),
        portraitBodyWidget: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisSize: MainAxisSize.min,
          children: [
            const AddressPageHeadline(
              headlineText: ShoppingPageString.selectAddress,
            ),
            Consumer<AddressChangerProvider>(builder: (
              context,
              address,
              c,
            ) {
              return Flexible(
                child: StreamBuilder<QuerySnapshot>(
                    stream: ShoppingApp.firestore
                        .collection(ShoppingApp.collectionUser)
                        .doc(ShoppingApp.sharedPreferences
                            .getString(ShoppingApp.userUID))
                        .collection(ShoppingApp.subCollectionAddress)
                        .snapshots(),
                    builder: (context, snapshot) {
                      return !snapshot.hasData
                          ? const AdaptiveCircularProgressCenter()
                          : snapshot.data!.docs.isEmpty
                              ? const EmptyShippingAddressContainer()
                              : ListView.builder(
                                  itemCount: snapshot.data?.docs.length,
                                  shrinkWrap: true,
                                  itemBuilder: (context, index) {
                                    return AddressCard(
                                      addressID: snapshot.data?.docs[index].id
                                          as String,
                                      currentIndex: address.count,
                                      model: AddressModel.fromJson(
                                        snapshot.data?.docs[index].data()
                                            as Map<String, dynamic>,
                                      ),
                                      totalAmount: widget.totalAmount,
                                      value: index,
                                    );
                                  },
                                );
                    }),
              );
            }),
          ],
        ),
      ),
    );
  }
}

class AddressCard extends StatefulWidget {

  const AddressCard({
    Key? key,
    required this.addressID,
    required this.currentIndex,
    required this.model,
    required this.totalAmount,
    required this.value,
  }) : super(key: key);

  final String addressID;
  final int currentIndex;
  final AddressModel model;
  final double totalAmount;
  final int value;

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

class _AddressCardState extends State<AddressCard> {
  @override
  Widget build(BuildContext context) {
    return AddressCardContainer(
      onTap: () {
        Provider.of<AddressChangerProvider>(
          context,
          listen: false,
        ).displayResult(widget.value);
      },
      addressCardColumn: AddressCardColumn(
        children: [
          Row(
            children: [
              AddressCardRadioButton(
                groupValue: widget.currentIndex,
                onChanged: (value) {
                  Provider.of<AddressChangerProvider>(
                    context,
                    listen: false,
                  ).displayResult(
                    value as int,
                  );
                },
                value: widget.value,
              ),
              AddressCardContent(
                city: widget.model.city as String,
                fullName: widget.model.name as String,
                phoneNumber: widget.model.phoneNumber as String,
                postalCode: widget.model.postalCode as String,
                state: widget.model.state as String,
                streetAddress: widget.model.streetAddress as String,
              ),
            ],
          ),
          widget.value == Provider.of<AddressChangerProvider>(context).count
              ? ShippingAddressProceedButton(
                  onPressed: () {
                    Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (
                          context,
                        ) =>
                            PlaceOrderPaymentPage(
                          addressID: widget.addressID,
                          totalAmount: widget.totalAmount,
                        ),
                      ),
                    );
                  },
                )
              : Container(),
        ],
      ),
    );
  }
}

class PlaceOrderPaymentPage extends StatefulWidget {
  const PlaceOrderPaymentPage({
    Key? key,
    required this.addressID,
    required this.totalAmount,
  }) : super(key: key);

  final String addressID;
  final double totalAmount;

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

class _PlaceOrderPaymentPageState extends State<PlaceOrderPaymentPage> {
  @override
  Widget build(BuildContext context) {
    return AdaptiveLayoutScaffold(
      appBar: const PlaceOrderPaymentPageAppBar(),
      landscapeBodyWidget: Container(),
      portraitBodyWidget: PlaceOrderPageContainer(
        orderOnPressed: () => addOrderDetails(),
      ),
    );
  }

  void addOrderDetails() {
    final time = DateTime.now().millisecondsSinceEpoch;

    writeOrderDetailsForUser({
      ShoppingApp.addressID: widget.addressID,
      ShoppingApp.totalAmount: widget.totalAmount,
      'orderBy': ShoppingApp.sharedPreferences.getString(
        ShoppingApp.userUID,
      ),
      ShoppingApp.productID: ShoppingApp.sharedPreferences.getStringList(
        ShoppingApp.userCartList,
      ),
      ShoppingApp.paymentDetails: ShoppingPageString.cashOnDelivery,
      ShoppingApp.orderTime: time.toString(),
      ShoppingApp.isSuccess: true,
    });

    writeOrderDetailsForAdmin({
      ShoppingApp.addressID: widget.addressID,
      ShoppingApp.totalAmount: widget.totalAmount,
      'orderBy': ShoppingApp.sharedPreferences.getString(
        ShoppingApp.userUID,
      ),
      ShoppingApp.productID: ShoppingApp.sharedPreferences.getStringList(
        ShoppingApp.userCartList,
      ),
      ShoppingApp.paymentDetails: ShoppingPageString.cashOnDelivery,
      ShoppingApp.orderTime: time.toString(),
      ShoppingApp.isSuccess: true,
    }).whenComplete(() => {
          emptyCartNow(),
        });
  }

  void emptyCartNow() {
    ShoppingApp.sharedPreferences.setStringList(ShoppingApp.userCartList, [
      'garbageValue',
    ]);
    List<String>? tempList = ShoppingApp.sharedPreferences.getStringList(
      ShoppingApp.userCartList,
    );

    FirebaseFirestore.instance
        .collection('users')
        .doc(ShoppingApp.sharedPreferences.getString(
          ShoppingApp.userUID,
        ))
        .update({
      ShoppingApp.userCartList: tempList,
    }).then((value) {
      ShoppingApp.sharedPreferences.setStringList(
        ShoppingApp.userCartList,
        tempList as List<String>,
      );
      Provider.of<CartItemCounterProvider>(
        context,
        listen: false,
      ).displayResult();
    });
    Fluttertoast.showToast(
      msg: ToastString.orderPlacedSuccessfully,
    );
    Navigator.pushReplacement(
      context,
      MaterialPageRoute(
        builder: (context) => const ShoppingPage(),
      ),
    );
  }

  Future<void> writeOrderDetailsForUser(
    Map<String, dynamic> data,
  ) async {
    await ShoppingApp.firestore
        .collection(ShoppingApp.collectionUser)
        .doc(ShoppingApp.sharedPreferences.getString(ShoppingApp.userUID))
        .collection(ShoppingApp.collectionOrders)
        .doc(
          ShoppingApp.sharedPreferences.getString(ShoppingApp.userUID)! +
              data['orderTime'],
        )
        .set(data);
  }

  Future<void> writeOrderDetailsForAdmin(Map<String, dynamic> data) async {
    await ShoppingApp.firestore
        .collection(ShoppingApp.collectionOrders)
        .doc(
          ShoppingApp.sharedPreferences.getString(ShoppingApp.userUID)! +
              data['orderTime'],
        )
        .set(data);
  }
}


class CartItemCounterProvider extends ChangeNotifier {
  final int _counter = (ShoppingApp.sharedPreferences
              .getStringList(
                ShoppingApp.userCartList,
              )
              ?.length ??
          0) -
      1;
  int get count => _counter;

  Future<void> displayResult() async {
    
    int _counter = (ShoppingApp.sharedPreferences
                .getStringList(
                  ShoppingApp.userCartList,
                )
                ?.length ??
            0) -
        1;

    await Future.delayed(
        const Duration(
          milliseconds: 100,
        ), () {
      notifyListeners();
    });
  }
}
0
Carleton Y 26 पद 2021, 03:02
क्या आप कोड स्निपेट जोड़ सकते हैं कि आप इस पेमेंटपेज विजेट को कैसे कॉल कर रहे हैं?
 – 
Yanni TheDeveloper
26 पद 2021, 03:20
@YanniTheDeveloper। मैंने ऊपर और कोड जोड़ा है जिसमें उम्मीद है कि आप जो खोज रहे हैं उसे शामिल करें। धन्यवाद।
 – 
Carleton Y
26 पद 2021, 04:02
मेरे लिए यह स्पष्ट है कि आपके पास राज्य प्रबंधन समस्या है, मैं इसे कोड पर डीबग नहीं कर सकता। यदि आप चाहते हैं कि मैं ज़ूम पर आपकी सहायता करूँ, तो आप मुझे अपना ईमेल यहाँ छोड़ सकते हैं। मेरे पास एक क्यू है उदाहरण के लिए सेटिंग => TotalAmount = 0; आप इसे model.price के साथ क्यों जोड़ रहे हैं? => कुल राशि = मॉडल। मूल्य! + कुल राशि;
 – 
Yanni TheDeveloper
27 पद 2021, 07:00
1
@YanniTheDeveloper। कोड की समीक्षा करने और टिप्पणी करने के लिए समय निकालने के लिए धन्यवाद। TotalAmount को 0 पर सेट करने और मूल्य जोड़ने के बारे में आपके प्रश्न का उत्तर यह है कि शॉपिंग कार्ट में डिफ़ॉल्ट रूप से 'कचरा मूल्य' होता है। तो कोड में लक्ष्य 0 इंडेक्स के लिए कुल 0 राशि निर्दिष्ट करना है। और फिर मैं मूल्य को कुल राशि में जोड़ने की कोशिश कर रहा हूं जब सूचकांक 1 या अधिक हो। 'अगर' में TotalAmount = model.price +totalAmount होने का कोई मतलब नहीं है, अगर आप यही पूछ रहे हैं।
 – 
Carleton Y
27 पद 2021, 08:44

1 उत्तर

सबसे बढ़िया उत्तर

CartCheckOutFAB को पहले हमेशा 0 मान के साथ इंस्टेंट किया जा रहा है क्योंकि ShoppingCartPage की स्थिति नहीं बदली जा रही है। आप Consumer2 को AdaptiveLayoutScaffold के पैरेंट के रूप में स्थानांतरित करने का प्रयास कर सकते हैं और amountProvider.totalAmount के साथ CartCheckOutFAB को इंस्टेंट कर सकते हैं। >

  • यदि यह काम नहीं कर रहा है तो क्या आप CartCheckOutFAB विजेट क्लास प्रदान कर सकते हैं।
1
Yanni TheDeveloper 28 पद 2021, 08:13
मैंने CartCheckOutFAB वर्ग को शामिल करने के लिए ऊपर दिए गए कोड को अपडेट किया। मैं आज दोपहर आपके परिवर्तनों का परीक्षण करूंगा। मैं आप सभी की मदद के लिए बहुत आभारी हूं।
 – 
Carleton Y
28 पद 2021, 16:31
मैंने मूल कोड को शॉपिंगकार्ट के एक अद्यतन संस्करण के साथ बदल दिया है जिसमें उपभोक्ता को स्थानांतरित करने का आपका सुझाव शामिल है। उसी समय मैंने CartCheckOutFAB को एक कस्टम विजेट के रूप में हटा दिया और इसे शॉपिंग कार्ट के अंदर ले जाया ताकि आप कोड देख सकें। मैंने TotalAmount और CartItemCounter प्रदाताओं और पता कार्ड को भी जोड़ा ताकि आपको कोड के विभिन्न भागों के बारे में अनुमान न लगाना पड़े। मैं इस बात से स्तब्ध हूं कि आपके सुझाए गए परिवर्तन ने व्यवहार को क्यों नहीं बदला। मुझे उस कोड से त्रुटियां करनी चाहिए जो आपने पहले देखी हैं। मदद के लिए एक बार फिर से धन्यवाद।
 – 
Carleton Y
28 पद 2021, 22:30
पहले उपभोक्ता को SliverToBoxAdapter में उसके डुप्लिकेट के रूप में हटा दें, दूसरा उपयोग AddressPage(totalAmount: amountProvider.totalAmount,), MaterialPageRoute में। 3 ब्रेक पॉइंट या प्रिंट टू कंसोल की मदद से सभी वर्गों में कुल राशि के मूल्य की जाँच करने का प्रयास करें। या AddressCardState में TotalAmount to PlaceOrderPaymentPage() पास करते समय Provider.of(context).totalAmount का उपयोग करें
 – 
Yanni TheDeveloper
30 पद 2021, 02:53
जबरदस्त मदद के लिए धन्यवाद। मैं आपके सुझाव का चरण दर चरण अनुसरण करूंगा और आपको बताऊंगा कि यह कैसे जाता है। मैंने तुरंत कंसोल के लिए एक प्रिंट किया और तुरंत देखा कि जब शॉपिंग कार्ट में एफएबी दबाया जाता है तो कुल राशि मान 0 होता है, इसलिए आपका विचार मुझे उस बिंदु को इंगित करने की अनुमति देगा जहां चीजें गलत हो रही हैं। यह भी खूब रही! आपके सुझाव देने से पहले मैंने स्पष्ट रूप से ऐसा करने के बारे में नहीं सोचा था।
 – 
Carleton Y
30 पद 2021, 09:09
1
ठीक है बढ़िया, मुझे खुशी है कि इसने आपको एक सुराग दिया!
 – 
Yanni TheDeveloper
31 पद 2021, 02:18