【问题标题】:I want to pass totalCartPrice to amount in openCheckout() in flutter application我想在颤振应用程序中将 totalCartPrice 传递给 openCheckout() 中的金额
【发布时间】:2021-01-03 07:14:30
【问题描述】:

我是 Flutter 新手,所以请帮助我。我想将此值 user provider.userModel.total cart price / 100 传递给 open checkout()

当用户点击结帐时,它会重定向到 Razorpay 支付网关。

代码:

import 'package:flutter_ecommerce/helpers/style.dart';
import 'package:flutter_ecommerce/models/cart_item.dart';
import 'package:flutter_ecommerce/provider/app_provider.dart';
import 'package:flutter_ecommerce/provider/user_provider.dart';
import 'package:flutter_ecommerce/services/order.dart';
import 'package:flutter_ecommerce/widgets/custom_text.dart';
import 'package:flutter_ecommerce/widgets/loading.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import 'package:uuid/uuid.dart';
import 'package:razorpay_flutter/razorpay_flutter.dart';

class CartScreen extends StatefulWidget {
  @override
  _CartScreenState createState() => _CartScreenState();
}

class _CartScreenState extends State<CartScreen> {
  final _key = GlobalKey<ScaffoldState>();
  OrderServices _orderServices = OrderServices();
  Razorpay razorpay;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();

    razorpay = new Razorpay();
    razorpay.on(Razorpay.EVENT_PAYMENT_SUCCESS, handlePaymentSuccess);
    razorpay.on(Razorpay.EVENT_PAYMENT_ERROR, handleErrorFailure);
    razorpay.on(Razorpay.EVENT_EXTERNAL_WALLET, handleExternalWallet);
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    razorpay.clear();
  }

  UserProvider userProvider;
  void openCheckout() {
    var options = {
      "key": "rzp_test_UhHkdZJX3q5bRq",
      "amount": userProvider.userModel.totalCartPrice,
      "name": "Payment",
      "description": "Payment for the product",
      "prefill": {
        "contact": "",
        "email": "",
      },
      "external": {
        "wallets": ["paytm"]
      }
    };
    try {
      razorpay.open(options);
    } catch (e) {
      print(e.toString());
    }
  }

  void handlePaymentSuccess(PaymentSuccessResponse response) {
    Fluttertoast.showToast(msg: "SUCCESS: " + response.paymentId);
  }

  void handleErrorFailure(PaymentFailureResponse response) {
    Fluttertoast.showToast(
        msg: "ERROR: " + response.code.toString() + " - " + response.message);
  }

  void handleExternalWallet(ExternalWalletResponse response) {
    Fluttertoast.showToast(msg: "EXTERNAL_WALLET: " + response.walletName);
  }

  @override
  Widget build(BuildContext context) {
    final userProvider = Provider.of<UserProvider>(context);
    final appProvider = Provider.of<AppProvider>(context);

    return Scaffold(
      key: _key,
      appBar: AppBar(
        iconTheme: IconThemeData(color: black),
        backgroundColor: white,
        elevation: 0.0,
        title: CustomText(text: "Shopping Cart"),
        leading: IconButton(
            icon: Icon(Icons.close),
            onPressed: () {
              Navigator.pop(context);
            }),
      ),
      backgroundColor: white,
      body: appProvider.isLoading
          ? Loading()
          : ListView.builder(
              itemCount: userProvider.userModel.cart.length,
              itemBuilder: (_, index) {
                return Padding(
                  padding: const EdgeInsets.all(16),
                  child: Container(
                    height: 120,
                    decoration: BoxDecoration(
                        borderRadius: BorderRadius.circular(20),
                        color: white,
                        boxShadow: [
                          BoxShadow(
                              color: red.withOpacity(0.2),
                              offset: Offset(3, 2),
                              blurRadius: 30)
                        ]),
                    child: Row(
                      children: <Widget>[
                        ClipRRect(
                          borderRadius: BorderRadius.only(
                            bottomLeft: Radius.circular(20),
                            topLeft: Radius.circular(20),
                          ),
                          child: Image.network(
                            userProvider.userModel.cart[index].image,
                            height: 120,
                            width: 140,
                            fit: BoxFit.fill,
                          ),
                        ),
                        SizedBox(
                          width: 10,
                        ),
                        Expanded(
                          child: Row(
                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
                            children: <Widget>[
                              RichText(
                                text: TextSpan(children: [
                                  TextSpan(
                                      text: userProvider
                                              .userModel.cart[index].name +
                                          "\n",
                                      style: TextStyle(
                                          color: black,
                                          fontSize: 20,
                                          fontWeight: FontWeight.bold)),
                                  TextSpan(
                                      text:
                                          "\$${userProvider.userModel.cart[index].price / 100} \n\n",
                                      style: TextStyle(
                                          color: black,
                                          fontSize: 18,
                                          fontWeight: FontWeight.w300)),
                                  TextSpan(
                                      text: "Quantity: ",
                                      style: TextStyle(
                                          color: grey,
                                          fontSize: 16,
                                          fontWeight: FontWeight.w400)),
                                  TextSpan(
                                      text: userProvider
                                          .userModel.cart[index].quantity
                                          .toString(),
                                      style: TextStyle(
                                          color: primary,
                                          fontSize: 16,
                                          fontWeight: FontWeight.w400)),
                                ]),
                              ),
                              IconButton(
                                  icon: Icon(
                                    Icons.delete,
                                    color: red,
                                  ),
                                  onPressed: () async {
                                    appProvider.changeIsLoading();
                                    bool success =
                                        await userProvider.removeFromCart(
                                            cartItem: userProvider
                                                .userModel.cart[index]);
                                    if (success) {
                                      userProvider.reloadUserModel();
                                      print("Item removed from cart");
                                      _key.currentState.showSnackBar(SnackBar(
                                          content: Text("Removed from Cart!")));
                                      appProvider.changeIsLoading();
                                      return;
                                    } else {
                                      appProvider.changeIsLoading();
                                    }
                                  })
                            ],
                          ),
                        )
                      ],
                    ),
                  ),
                );
              }),
      bottomNavigationBar: Container(
        height: 70,
        child: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              RichText(
                text: TextSpan(children: [
                  TextSpan(
                      text: "Total: ",
                      style: TextStyle(
                          color: grey,
                          fontSize: 22,
                          fontWeight: FontWeight.w400)),
                  TextSpan(
                      text: " \$${userProvider.userModel.totalCartPrice / 100}",
                      style: TextStyle(
                          color: black,
                          fontSize: 22,
                          fontWeight: FontWeight.normal)),
                ]),
              ),
              Container(
                decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(20), color: black),
                child: FlatButton(
                    onPressed: () {
                      if (userProvider.userModel.totalCartPrice == 0) {
                        showDialog(
                            context: context,
                            builder: (BuildContext context) {
                              return Dialog(
                                shape: RoundedRectangleBorder(
                                    borderRadius: BorderRadius.circular(20.0)),
                                //this right here
                                child: Container(
                                  height: 200,
                                  child: Padding(
                                    padding: const EdgeInsets.all(12.0),
                                    child: Column(
                                      mainAxisAlignment:
                                          MainAxisAlignment.center,
                                      crossAxisAlignment:
                                          CrossAxisAlignment.start,
                                      children: [
                                        Row(
                                          mainAxisAlignment:
                                              MainAxisAlignment.center,
                                          children: <Widget>[
                                            Text(
                                              'Your cart is empty',
                                              textAlign: TextAlign.center,
                                            ),
                                          ],
                                        ),
                                      ],
                                    ),
                                  ),
                                ),
                              );
                            });
                        return;
                      }
                      showDialog(
                          context: context,
                          builder: (BuildContext context) {
                            return Dialog(
                              shape: RoundedRectangleBorder(
                                  borderRadius: BorderRadius.circular(20.0)),
                              //this right here
                              child: Container(
                                height: 200,
                                child: Padding(
                                  padding: const EdgeInsets.all(12.0),
                                  child: Column(
                                    mainAxisAlignment: MainAxisAlignment.center,
                                    crossAxisAlignment:
                                        CrossAxisAlignment.start,
                                    children: [
                                      Text(
                                        'You will be charged \$${userProvider.userModel.totalCartPrice / 100} upon delivery!',
                                        textAlign: TextAlign.center,
                                      ),
                                      SizedBox(
                                        width: 320.0,
                                        child: RaisedButton(
                                          onPressed: () {
                                            openCheckout();
                                            // var uuid = Uuid();
                                            // String id = uuid.v4();
                                            // _orderServices.createOrder(
                                            //     userId: userProvider.user.uid,
                                            //     id: id,
                                            //     description:
                                            //         "Some random description",
                                            //     status: "complete",
                                            //     totalPrice: userProvider
                                            //         .userModel.totalCartPrice,
                                            //     cart: userProvider
                                            //         .userModel.cart);
                                            // for (CartItemModel cartItem
                                            //     in userProvider
                                            //         .userModel.cart) {
                                            //   bool value = await userProvider
                                            //       .removeFromCart(
                                            //           cartItem: cartItem);
                                            //   if (value) {
                                            //     userProvider.reloadUserModel();
                                            //     print("Item added to cart");
                                            //     _key.currentState.showSnackBar(
                                            //         SnackBar(
                                            //             content: Text(
                                            //                 "Removed from Cart!")));
                                            //   } else {
                                            //     print("ITEM WAS NOT REMOVED");
                                            //   }
                                            // }
                                            // _key.currentState.showSnackBar(
                                            //     SnackBar(
                                            //         content: Text(
                                            //             "Order created!")));
                                            // Navigator.pop(context);
                                          },
                                          child: Text(
                                            "Accept",
                                            style:
                                                TextStyle(color: Colors.white),
                                          ),
                                          color: const Color(0xFF1BC0C5),
                                        ),
                                      ),
                                      SizedBox(
                                        width: 320.0,
                                        child: RaisedButton(
                                            onPressed: () {
                                              Navigator.pop(context);
                                            },
                                            child: Text(
                                              "Reject",
                                              style: TextStyle(
                                                  color: Colors.white),
                                            ),
                                            color: red),
                                      )
                                    ],
                                  ),
                                ),
                              ),
                            );
                          });
                    },
                    child: CustomText(
                      text: "Check out",
                      size: 20,
                      color: white,
                      weight: FontWeight.normal,
                    )),
              )
            ],
          ),
        ),
      ),
    );
  }
}

但是当我尝试这样做时,它会将空值传递给数量。请帮我解决这些问题。

【问题讨论】:

    标签: firebase flutter google-cloud-firestore provider razorpay


    【解决方案1】:

    Razor 以卢比计费,因此如果您有 100 卢比,那么在结帐时您必须通过您的 amount *100 。 所以下面的结帐方法是:

    void openCheckout() {
        var options = {
          "key": "rzp_test_UhHkdZJX3q5bRq",
          "amount": userProvider.userModel.totalCartPrice * 100,
          "name": "Payment",
          "description": "Payment for the product",
          "prefill": {
            "contact": "",
            "email": "",
          },
          "external": {
            "wallets": ["paytm"]
          }
        };
        try {
          razorpay.open(options);
        } catch (e) {
          print(e.toString());
        }
      }
    

    查看以下链接:

    https://razorpay.com/docs/payment-gateway/web-integration/standard/

    【讨论】:

    • 感谢您的回复,但我知道这件事,但我面临的问题是 userProvider.userModel.totalCartPrice 向我显示此错误 getter 'userModel' was called on null。 @AddWeb 解决方案私人有限公司
    • 请在调用 openCheckout() 方法之前检查 userProvider.userModel.totalCartPrice 是否为空。
    • 因为你没有正确初始化这个对象。 @JAINISHSHAH
    • 感谢您的回复 问题已解决。 @ AddWeb 解决方案私人有限公司
    • 如果这个答案对你有帮助,那就太好了。请投票给我。
    猜你喜欢
    • 2021-08-08
    • 1970-01-01
    • 2021-03-26
    • 2020-11-28
    • 2020-08-20
    • 2019-02-03
    • 1970-01-01
    • 2018-10-27
    • 2020-02-13
    相关资源
    最近更新 更多