首页 > 解决方案 > Flutter 应用程序在使用 Google Pay 处理付款后崩溃

问题描述

我正在尝试使用颤振谷歌支付插件在我的颤振应用程序中设置付款处理。处理付款时,会出现 Google Pay 窗口,我可以选择一张卡并成功处理付款。然后,Google Pay 窗口关闭,应用程序崩溃并显示以下跟踪信息。

2020-01-04 15:44:32.699 8789-8789/? E/.grocery_bulle: Unknown bits set in runtime_flags: 0x8000
2020-01-04 15:44:42.205 8789-8789/com.phrasing.grocery_bullet E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.phrasing.grocery_bullet, PID: 8789
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=991, result=-1, data=Intent { (has extras) }} to activity {com.phrasing.grocery_bullet/com.phrasing.grocery_bullet.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'void io.flutter.plugin.common.MethodChannel$Result.success(java.lang.Object)' on a null object reference
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4845)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4886)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'void io.flutter.plugin.common.MethodChannel$Result.success(java.lang.Object)' on a null object reference
        at snail.app.flutter.google.pay.FlutterGooglePayPlugin.callToDartOnPaymentSuccess(FlutterGooglePayPlugin.java:126)
        at snail.app.flutter.google.pay.FlutterGooglePayPlugin.onActivityResult(FlutterGooglePayPlugin.java:291)
        at io.flutter.embedding.engine.FlutterEnginePluginRegistry$FlutterEngineActivityPluginBinding.onActivityResult(FlutterEnginePluginRegistry.java:634)
        at io.flutter.embedding.engine.FlutterEnginePluginRegistry.onActivityResult(FlutterEnginePluginRegistry.java:367)
        at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onActivityResult(FlutterActivityAndFragmentDelegate.java:546)
        at io.flutter.embedding.android.FlutterActivity.onActivityResult(FlutterActivity.java:594)
        at android.app.Activity.dispatchActivityResult(Activity.java:8110)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4838)

这是代码

class _CartState extends State<Cart> {
  CartModel _cartModel;

  @override
  Widget build(BuildContext context) {
    _cartModel = Provider.of<CartModel>(context);
    return Container(
      color: Colors.white,
      child: Column(
        children: [
          Expanded(
            child: Padding(
              padding: const EdgeInsets.all(32),
              child: _CartContents(),
            ),
          ),
          Divider(height: 10, color: Colors.black),
          _CartTotal(),
          SizedBox(
            width: double.infinity,
            child: RaisedButton(
              onPressed: () async {
                await _makeStripePayment(context);
              },
              child: Text('Buy', style: Theme.of(context).textTheme.display4),
              color: Colors.lightGreen,
              textColor: Colors.white,
            ),
          ),
        ],
      ),
    );
  }

  _makeStripePayment(BuildContext context) async {
    var environment = 'rest'; // or 'production'

    if (!(await FlutterGooglePay.isAvailable(environment))) {
      Scaffold.of(context).showSnackBar(SnackBar(
        content: Text('Google pay is not available'),
      ));
    } else {
      PaymentItem pm = PaymentItem(
          stripeToken: 'pk_test_1IV5H8NyhgGYOeK6vYV3Qw8f',
          stripeVersion: "2018-11-08",
          currencyCode: "usd",
          amount: "0.10",
          gateway: 'stripe');

      FlutterGooglePay.makePayment(pm).then((Result result) {
        if (result.status == ResultStatus.SUCCESS) {
          Map<Item, int> cartItems = _cartModel.getCart();
          for (Item item in cartItems.keys) {
            int itemCountRequested = cartItems[item];
            Firestore.instance.runTransaction((transaction) async {
              DocumentSnapshot freshSnap =
                  await transaction.get(item.reference);
              int itemCountAvailable = freshSnap['count'];
              int itemCountSent = itemCountAvailable >= itemCountRequested
                  ? itemCountRequested
                  : itemCountAvailable;
              int itemCountRemaining = itemCountAvailable - itemCountSent;
              await transaction.update(freshSnap.reference, {
                'count': itemCountRemaining,
              });
            });
          }
          _cartModel.resetCart();
          Scaffold.of(context).showSnackBar(
              SnackBar(content: Text('Your items are on the way!!')));
        }
      }).catchError((dynamic error) {
        Scaffold.of(context).showSnackBar(SnackBar(
          content: Text(error.toString()),
        ));
      });
    }
  }
}

标签: androidflutterandroid-payflutter-packages

解决方案


推荐阅读