如何在同一个inappwebview Flutter中打开弹窗?

Posted

技术标签:

【中文标题】如何在同一个inappwebview Flutter中打开弹窗?【英文标题】:How to open the popup window in the same inappwebview Flutter? 【发布时间】:2021-11-24 04:00:51 【问题描述】:

我已集成 RazorPay 自定义结帐,我已在其中为良好的用户体验创建了自定义设计。

我正在inappwebview 和 Flutter plugin 中打开这个定制的网络应用程序。 Web 应用程序可以正确打开,但一旦 Razorpay 的 SDK 函数 createPayment(data) 运行,它就会打开一个窗口弹出窗口。这个弹出窗口现在在 webview 中不可见。

调用 webview 的 Flutter 代码:

  @override
  Widget build(BuildContext context) 
    return WillPopScope(
      onWillPop: _handleBackPress,
      child: SafeArea(
        child: Scaffold(
          body: InAppWebView(
            initialUrlRequest: URLRequest(
              url: Uri.parse(Strings.checkoutUrl),
            ),
            initialOptions: InAppWebViewGroupOptions(
              crossPlatform: InAppWebViewOptions(
                clearCache: true,
                javascriptCanOpenWindowsAutomatically: true, // I thought this will help, but not working
                mediaPlaybackRequiresUserGesture: false,
              ),
              android: AndroidInAppWebViewOptions(useHybridComposition: true),
              ios: IOSInAppWebViewOptions(allowsInlineMediaPlayback: true),
            ),
            onWebViewCreated: (controller) async 
              _controller = controller;
              _controller.clearCache();
              _controller.addJavaScriptHandler(
                handlerName: 'PaymentHandle',
                callback: (data) 
                  // ... Will do somthing
                ,
              );
            ,
            onLoadStop: (_, __) async 
              await _controller.evaluateJavascript(source: '''
                  window.parent.postMessage($widget.paymentJsonData, "*");
                ''');
            ,
          ),
        ),
      ),
    );
  

调用createPayment()的代码:当用户点击一个按钮时,这个函数在webapp上被调用。

    async makePayment() 
      try 
        const data = 
          callback_url: '<Callback URL>',
          redirect: true,
          amount: 50000,
          email: 'gaurav.kumar@example.com',
          contact: '9123456780',
          order_id: 'order_<order_hash>',
          method: 'upi',
          upi: 
            vpa: this.vpa, // Fetch from input field
            flow: 'collect,',
          ,
        ;

        window.rz.createPayment(data);
        window.rz.focus(); // Found in RazorPay's document to bring the window in focus. Not working on Webview
       catch (e) 
        console.error(e);
      
    ,

PS - RazorPay 的初始化工作正常。我们在浏览器上单独运行 Webview。弹出窗口正在正确打开

【问题讨论】:

【参考方案1】:

如果您不想在单独的窗口中打开重定向 URL。在 Razorpay 的全局配置中,您必须传递 redirect: true 而不是在 data 对象中传递 createPayment() 方法;

 this.configOptions = 
    key: process.env.VUE_APP_API_KEY,
    redirect: true,
     ...
 ;
  // eslint-disable-next-line no-undef
  window.rz = new Razorpay(this.configOptions);

【讨论】:

以上是关于如何在同一个inappwebview Flutter中打开弹窗?的主要内容,如果未能解决你的问题,请参考以下文章

如何保存第一次登录的 sessionId 并且不会让我每次都在 inappwebview 中登录

在 SingleChildScrollView 内颤动 InAppWebView

flutter_inappwebview本地https连接在flutter应用程序中被拒绝

Flutter - InAppWebView 中的 Jitsi Meet 回调

InAppWebView 拦截网络请求 打开微信支付或者支付宝支付

inappwebview 中的flutter_problem