webview_flutter在生产模式下加载条纹签出页面时会给出一个空白页面



我在Flutter中通过网络视图集成了Stripe结账页面。如果我使用stripe的测试模式,一切都很好,但一旦我切换到生产模式,web视图就完全是空白的。在条纹控制台中,我可以看到页面被加载,每次我打电话时都会取消付款,所以条纹页面正在工作。有什么建议吗?

import 'dart:convert';
import 'package:buildabuild/utils/constants.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:webview_flutter/webview_flutter.dart';
const String stripeHtmlPage = '''
<!DOCTYPE html>
<html>
<script src="https://js.stripe.com/v3/"></script>
<head><title>Stripe checkout</title></head>
<body>
</body>
</html>
''';
class CheckoutScreen extends StatefulWidget {
final String sessionId;
const CheckoutScreen(
this.sessionId, {
Key? key,
}) : super(key: key);
@override
_CheckoutScreenState createState() => _CheckoutScreenState();
}
class _CheckoutScreenState extends State<CheckoutScreen> {
late WebViewController _webViewController;
String get initialUrl =>
'data:text/html;base64,${base64Encode(const Utf8Encoder().convert(stripeHtmlPage))}';
void _redirectToStripe() {
final redirectToCheckoutJs = '''
var stripe = Stripe('$stripePublishableKeyProd');

stripe.redirectToCheckout({
sessionId: '${widget.sessionId}'
}).then(function (result) {
result.error.message = 'Error'
});
''';
_webViewController.runJavascript(redirectToCheckoutJs);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: WebView(
initialUrl: initialUrl,
javascriptMode: JavascriptMode.unrestricted,
onWebViewCreated: (webViewController) =>
_webViewController = webViewController,
onPageFinished: (String url) {
if (url == initialUrl) {
_redirectToStripe();
}
},
navigationDelegate: (NavigationRequest request) {
if (request.url == 'https://success.com/') {
Get.back(result: 'OK');
} else if (request.url == 'https://cancel.com/') {
Get.back(result: 'KO');
}
return NavigationDecision.navigate;
},
),
),
);
}
}

我通过实验发现,托管页面并通过服务提供服务(我使用了Firebase hosting,但可以肯定的是,它也可以与其他服务一起使用(,直接打开页面解决了问题。但是我不知道为什么,如果有人有想法,他/她是受欢迎的。

新代码:

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:webview_flutter/webview_flutter.dart';
class CheckoutScreen extends StatelessWidget {
final String sessionId;
const CheckoutScreen(
this.sessionId, {
Key? key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: WebView(
initialUrl: '***hosting_address***/checkout.html?sessionId=$sessionId',
javascriptMode: JavascriptMode.unrestricted,
navigationDelegate: (NavigationRequest request) {
if (request.url == 'https://success.com/') {
Get.back(result: 'OK');
} else if (request.url == 'https://cancel.com/') {
Get.back(result: 'KO');
}
return NavigationDecision.navigate;
},
),
),
);
}
}

相关内容

最新更新