{"templateId":"markdown","versions":[{"version":"v1","label":"v1","link":"/products/checkout/flutter/web-sdk","default":true,"active":true,"folderId":"27aa35cb"}],"sharedDataIds":{"sidebar":"sidebar-products/checkout/flutter/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["partial","tabs","tab","code-snippet","admonition"]},"custom_product":"Checkout","type":"markdown"},"seo":{"title":"Flutter integration with Web SDK","description":"Worldpay for Developers - docs, code examples, resources and tools. Everything you need to build your omnichannel payment solution.","siteUrl":"https://docs.worldpay.com/access","image":"/access/assets/worldpay-logo-light.21b7daf79984773a9fcd7d4fbcb07ae5289dfffd6023c4c3dca720c7058e53dc.33f780a6.svg","keywords":"documentation, api, openapi, sdks, developer, payments, json, payouts, 3ds","jsonLd":{"@context":"https://schema.org","@type":"Organization","url":"https://docs.worldpay.com/access","name":"Worldpay"},"meta":[{"name":"google-site-verification","content":"zjziIKaP3ImsqsfhYnEBnq1R85UabiSwl7HTXuwtZuo"},{"name":"doc_product","content":"Access"},{"name":"doc_category","content":"Documentation"}],"llmstxt":{"hide":false,"sections":[{"title":"Payments API","description":"Payment orchestration API combining fraud assessment, 3ds authentication, SCA exemptions, Worldpay Token creation and a card or wallet based payment.","includeFiles":["products/payments/@20240601/**/*"],"excludeFiles":[]},{"title":"Payment Queries API","description":"Querying your payments data, based on a variety of parameters.","includeFiles":["products/payment-queries/@v1/**/*"],"excludeFiles":[]},{"title":"Card BIN Data API","description":"Provides detailed information about a card.","includeFiles":["products/card-bin/@v1/**/*"],"excludeFiles":[]},{"title":"3DS Authentication API","description":"Request 3DS authentication to protect against fraud, be SCA compliant and to shift liability using this standalone API.","includeFiles":["products/3ds/@v3/**/*"],"excludeFiles":[]},{"title":"FraudSight API","description":"Request a risk assessment and receive a response with an outcome (e.g. lowRisk) using this standalone API.","includeFiles":["products/fraudsight/@v1/**/*"],"excludeFiles":[]},{"title":"Checkout SDK","description":"Integrate using our clientside SDKs for both web and native devices. Benefit from SAQ-A/PCI-SSF compliance.","includeFiles":["products/checkout/web/@v2/**/*","products/checkout/ios/@v4/**/*","products/checkout/android/@v4/**/*","products/checkout/react-native/@v3/**/*","products/checkout/flutter/@v1/**/*"],"excludeFiles":[]},{"title":"Tokens API","description":"Minimizes the exposure of sensitive card details and increases the security of your customer's card details.","includeFiles":["products/tokens/@v3/**/*"],"excludeFiles":[]},{"title":"Card Payments API","description":"Request a card payment using this standalone API, requires separate requests for 3DS, Fraud assessment etc.","includeFiles":["products/card-payments/@v7/**/*"],"excludeFiles":[]},{"title":"Card Verifications API","description":"Verify your customer's card to maximize your authentication rates.","includeFiles":["products/card-verifications/@v6/**/*"],"excludeFiles":[]},{"title":"Account Payouts API","description":"Send funds to your customer's bank accounts and search for payouts using parameters.","includeFiles":["products/account-payouts/@20250101/**/*"],"excludeFiles":[]},{"title":"APMs","description":"Pay using eWallets, bank transfers, direct debits, local card schemes, Postpay and eInvoice/ Buy Now Pay Later.","includeFiles":["products/apms/@20240701/**/*"],"excludeFiles":[]},{"title":"Balance API","description":"Request your account details for a single account or all accounts under an entity.","includeFiles":["products/balance/@20250101/**/*"],"excludeFiles":[]},{"title":"Card Payouts API","description":"Send funds to your customer's cards.","includeFiles":["products/card-payouts/@v4/**/*"],"excludeFiles":[]},{"title":"Events (Webhooks)","description":"Receive status updates from Access Worldpay by setting up a webhook.","includeFiles":["products/events/@v1/**/*"],"excludeFiles":[]},{"title":"FX API","description":"Manage Foreign Exchange (FX) on your payments.","includeFiles":["products/fx/@v1/**/*"],"excludeFiles":[]},{"title":"Hosted Payment Pages (HPP) API","description":"Our low-code option to take payments securely at the lowest PCI compliance level - SAQ A.","includeFiles":["products/hosted-payment-pages/@v1/**/*"],"excludeFiles":[]},{"title":"Money Transfers API","description":"Money Transfer OCTs (Original Credit Transaction) allow funds to be pushed to an eligible card in 30 minutes or less.","includeFiles":["products/money-transfers/@v1/**/*"],"excludeFiles":[]},{"title":"Parties API","description":"Create parties, manage your payout instruments and beneficial owners and carry out identity verification checks.","includeFiles":["products/parties/@20250101/**/*"],"excludeFiles":[]},{"title":"SCA Exemptions API","description":"Maximize a frictionless checkout experience by using issuer data insights to apply exemptions.","includeFiles":["products/sca-exemptions/@v1/**/*"],"excludeFiles":[]},{"title":"Split Payments API","description":"Divide funds from a single payment amongst yourself and your parties/sellers.","includeFiles":["products/split-payments/@20250625/**/*"],"excludeFiles":[]},{"title":"Statements API","description":"Retrieve your account statement and see individual entries for all credits and debits.","includeFiles":["products/statements/@20250101/**/*"],"excludeFiles":[]},{"title":"Transfers API","description":"Transfer funds from source account to target account.","includeFiles":["products/transfers/@20250101/**/*"],"excludeFiles":[]},{"title":"Verified Tokens API","description":"Verified Tokens ensures that your customer's payment details are valid and CIT compliant when creating a token.","includeFiles":["products/verified-tokens/@v3/**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Last updated"]},": 17 March 2025"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"flutter-integration-with-web-sdk","__idx":0},"children":["Flutter integration with Web SDK"]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"overview","__idx":1},"children":["Overview"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The integration consists of using ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://pub.dev/packages/webview_flutter"},"children":["web_flutter"]}," (the Flutter equivalent of an iframe) to display a HTML form, which uses the Access Checkout Web SDK to interface with the Flutter layer."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"integration","__idx":2},"children":["Integration"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Follow one of our guides (e.g. ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/checkout/web/card-only"},"children":["create a session to pay with a card"]},") to integrate the Access Checkout Web SDK into a HTML page."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Add the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://pub.dev/packages/webview_flutter"},"children":["webview_flutter"]}," package to your application by following the webview_flutter ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://pub.dev/packages/webview_flutter/install"},"children":["installation steps"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your iOS folder ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Podfile"]}," must be set up to automatically source an additional dependency called ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["webview_flutter_wkwebview"]},".",{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["if you have a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Podfile"]},", make sure that it contains the same code as in the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/flutter/packages/blob/main/packages/webview_flutter/webview_flutter/example/ios/Podfile"},"children":["webview_flutter example application Podfile"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["if you don't have a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Podfile"]}," under the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ios"]}," folder, you must generate one and it should be correctly set up by default. Run ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["flutter run"]}," and select an iOS device as the destination or, run ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["flutter build ios"]}," and follow the instructions"]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Import the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["webview_flutter"]}," package in your stateful widget using ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["import 'package:webview_flutter/webview_flutter.dart';"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Create an instance of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["WebViewController"]}," in your widget's state and set the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["JavaScript"]}," mode as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["unrestricted"]},":"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"dart","header":{"controls":{"copy":{}}},"source":"class _WebViewState extends State<AccessCheckoutWebWidget> {\n   late WebViewController controller;\n   // ...\n\n   @override\n   void initState() {\n      super.initState();\n\n      // ...\n\n      controller = WebViewController()\n         ..setJavaScriptMode(JavaScriptMode.unrestricted)\n         ..setNavigationDelegate(\n            NavigationDelegate(\n               onProgress: (int progress) {},\n               onPageStarted: (String url) {},\n               onPageFinished: (String url) {},\n               onHttpError: (HttpResponseError error) {\n                  print(error.response);\n               },\n               onWebResourceError: (WebResourceError error) {\n                  print(error.description);\n               },\n            ),\n         );\n   }\n}\n","lang":"dart"},"children":[]},{"$$mdtype":"Tag","name":"ol","attributes":{"start":6},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Add a JavaScript channel with a message listener to the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["WebViewController"]},". The JavaScript channel intercepts the messages that is sent to Flutter from the JavaScript layer:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"dart","header":{"controls":{"copy":{}}},"source":"controller = WebViewController()\n   ..addJavaScriptChannel(\n      'flutterWebView',\n      onMessageReceived: (dynamic message) {\n         setState(() {\n            sessionToken = message.message;\n         });\n      },\n   )\n   // ...\n","lang":"dart"},"children":[]},{"$$mdtype":"Tag","name":"ol","attributes":{"start":7},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["In ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["WebViewController"]},", load the URL of the HTML page that contains your card form. At this stage, you should be able to see your card form displayed in your Flutter application:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"dart","header":{"controls":{"copy":{}}},"source":"controller = WebViewController()\n   // ...\n   ..loadRequest(\n      Uri.parse(\"...\"),\n   );\n","lang":"dart"},"children":[]},{"$$mdtype":"Tag","name":"ol","attributes":{"start":8},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Use the Flutter 'postMessage' function from the JavaScript channel in your JavaScript code to communicate from the JavaScript layer to the Flutter layer. It is available in the JavaScript context as a variable that has the same name as the name used when defining the JavaScript channel in the Flutter code:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"Worldpay.checkout.init(\n {\n   ...\n },\n function (error, checkout) {\n   // ...\n\n   form.addEventListener(\"submit\", function (event) {\n     event.preventDefault();\n\n     checkout.generateSessionState(function (error, sessionState) {\n       // the session is sent to the Flutter layer using the Flutter postMessage mechanism \n       flutterJSChannel.postMessage(sessionState)\n     });\n   });\n   \n   // ...\n }\n);\n","lang":"javascript"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"full-integration-example","__idx":3},"children":["Full integration example"]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"label":"Flutter","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"./code/web-sdk/flutter.dart","language":"dart","header":{"controls":{"copy":{}}},"lang":"dart","source":"import 'package:flutter/material.dart';\nimport 'package:webview_flutter/webview_flutter.dart';\n\nclass AccessCheckoutWebWidget extends StatefulWidget {\n  const AccessCheckoutWebWidget({super.key});\n\n  @override\n  State<AccessCheckoutWebWidget> createState() => _WebViewState();\n}\n\nclass _WebViewState extends State<AccessCheckoutWebWidget> {\n  late WebViewController controller;\n  String sessionToken = \"\";\n\n  @override\n  void initState() {\n    super.initState();\n    checkoutId = widget.checkoutId;\n    iframeBaseUrl = widget.iframeBaseUrl;\n\n    controller = WebViewController()\n      ..setJavaScriptMode(JavaScriptMode.unrestricted)\n      ..addJavaScriptChannel(\n        'flutterJSChannel',\n        onMessageReceived: (dynamic message) {\n          setState(() {\n            sessionToken = message.message;\n          });\n        },\n      )\n      ..setNavigationDelegate(\n        NavigationDelegate(\n          onProgress: (int progress) {},\n          onPageStarted: (String url) {},\n          onPageFinished: (String url) {},\n          onHttpError: (HttpResponseError error) {\n            print(error.response);\n          },\n          onWebResourceError: (WebResourceError error) {\n            print(error.description);\n          },\n        ),\n      )\n      ..loadRequest(\n        Uri.parse(\"<replace-with-your-url-to-form.html>\"),\n      );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      body: Padding(\n        padding: const EdgeInsets.all(0),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.center,\n          children: [\n            SizedBox(\n                width: 400,\n                height: 450,\n                child: WebViewWidget(controller: controller)\n            ),\n            if (sessionToken != \"\") Text(sessionToken),\n          ],\n        )));\n  }\n}\n"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"HTML (form.html)","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"./code/web-sdk/iframe-html.html","language":"html","header":{"controls":{"copy":{}}},"lang":"html","source":"<html>\n<head>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <link rel=\"stylesheet\" href=\"form.css\" />\n</head>\n<body>\n<section class=\"container\">\n    <section class=\"card\">\n        <form class=\"checkout\" id=\"card-form\">\n            <div class=\"label\">Card number <span class=\"type\"></span></div>\n            <section id=\"card-pan\" class=\"field\"></section>\n            <section class=\"col-2\">\n                <section class=\"col\">\n                    <div class=\"label\">Expiry date</div>\n                    <section id=\"card-expiry\" class=\"field\"></section>\n                </section>\n                <section class=\"col\">\n                    <div class=\"label\">CVV</div>\n                    <section id=\"card-cvv\" class=\"field\"></section>\n                </section>\n            </section>\n            <button class=\"submit\" type=\"submit\">Pay Now</button>\n        </form>\n        <button class=\"clear\" id=\"clear\">Clear</button>\n    </section>\n</section>\n\n<script src=\"https://try.access.worldpay.com/access-checkout/v2/checkout.js\"></script>\n<script src=\"form.js\"></script>\n</body>\n</html>\n"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"CSS (form.css)","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"./code/web-sdk/iframe-css.css","language":"css","header":{"controls":{"copy":{}}},"lang":"css","source":"body {\n    font: 11px/22px sans-serif;\n    text-transform: uppercase;\n    background-color: #f7f7f7;\n    color: black;\n}\n\n.container {\n    height: 100vh;\n    display: flex;\n    justify-content: center;\n    align-items: flex-start;\n}\n\n.card {\n    position: relative;\n    background: white;\n    padding: 40px 30px;\n    top: 5px;\n    width: 100%;\n    max-width: 300px;\n    border-radius: 12px;\n    box-shadow: 3px 3px 60px 0px rgba(0, 0, 0, 0.1);\n}\n.card .checkout .col-2 {\n    display: flex;\n}\n.card .checkout .col-2 .col:first-child {\n    margin-right: 15px;\n}\n.card .checkout .col-2 .col:last-child {\n    margin-left: 15px;\n}\n.card .checkout .label .type {\n    color: green;\n}\n.card .checkout.visa .label .type:before {\n    content: \"(visa)\";\n}\n.card .checkout.mastercard .label .type:before {\n    content: \"(master card)\";\n}\n.card .checkout.amex .label .type:before {\n    content: \"(american express)\";\n}\n.card .checkout .field {\n    height: 40px;\n    border-bottom: 1px solid lightgray;\n}\n.card .checkout .field#card-pan {\n    margin-bottom: 30px;\n}\n.card .checkout .field.is-onfocus {\n    border-color: black;\n}\n.card .checkout .field.is-empty {\n    border-color: orange;\n}\n.card .checkout .field.is-invalid {\n    border-color: red;\n}\n.card .checkout .field.is-valid {\n    border-color: green;\n}\n.card .checkout .submit {\n    background: red;\n    position: absolute;\n    cursor: pointer;\n    left: 50%;\n    bottom: -60px;\n    width: 200px;\n    margin-left: -100px;\n    color: white;\n    outline: 0;\n    font-size: 14px;\n    border: 0;\n    border-radius: 30px;\n    text-transform: uppercase;\n    font-weight: bold;\n    padding: 15px 0;\n    transition: background 0.3s ease;\n}\n.card .checkout.is-valid .submit {\n    background: green;\n}\n\n.clear {\n    background: grey;\n    position: absolute;\n    cursor: pointer;\n    left: 50%;\n    bottom: -120px;\n    width: 200px;\n    margin-left: -100px;\n    color: white;\n    outline: 0;\n    font-size: 14px;\n    border: 0;\n    border-radius: 30px;\n    text-transform: uppercase;\n    font-weight: bold;\n    padding: 15px 0;\n    transition: background 0.3s ease;\n}\n"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"JavaScript (form.js)","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"./code/web-sdk/iframe-javascript.js","language":"javascript","header":{"controls":{"copy":{}}},"lang":"javascript","source":"(function () {\n  var form = document.getElementById(\"card-form\");\n  var clear = document.getElementById(\"clear\");\n\n  Worldpay.checkout.init(\n    {\n      id: \"<replace-with-your-checkout-id>\",\n      form: \"#card-form\",\n      fields: {\n        pan: {\n          selector: \"#card-pan\",\n          placeholder: \"4444 3333 2222 1111\"\n        },\n        expiry: {\n          selector: \"#card-expiry\",\n          placeholder: \"MM/YY\"\n        },\n        cvv: {\n          selector: \"#card-cvv\",\n          placeholder: \"123\"\n        }\n      },\n      styles: {\n        \"input\": {\n          \"color\": \"black\",\n          \"font-weight\": \"bold\",\n          \"font-size\": \"20px\",\n          \"letter-spacing\": \"3px\"\n        },\n        \"input#pan\": {\n          \"font-size\": \"24px\"\n        },\n        \"input.is-valid\": {\n          \"color\": \"green\"\n        },\n        \"input.is-invalid\": {\n          \"color\": \"red\"\n        },\n        \"input.is-onfocus\": {\n          \"color\": \"black\"\n        }\n      },\n      accessibility: {\n        ariaLabel: {\n          pan: \"my custom aria label for pan input\",\n          expiry: \"my custom aria label for expiry input\",\n          cvv: \"my custom aria label for cvv input\"\n        },\n        lang: {\n          locale: \"en-GB\"\n        },\n        title: {\n          enabled: true,\n          pan: \"my custom title for pan\",\n          expiry: \"my custom title for expiry date\",\n          cvv: \"my custom title for security code\"\n        }\n      },\n      enablePanFormatting: true\n    },\n    function (error, checkout) {\n      if (error) {\n        // the error is sent to the Flutter layer using the Flutter postMessage mechanism\n        flutterJSChannel.postMessage(error);\n        return;\n      }\n\n      form.addEventListener(\"submit\", function (event) {\n        event.preventDefault();\n\n        checkout.generateSessionState(function (error, sessionState) {\n          if (error) {\n            // the error is sent to the Flutter layer using the Flutter postMessage mechanism\n            flutterJSChannel.postMessage(error);\n            return;\n          }\n\n          // the session is sent to the Flutter layer using the Flutter postMessage mechanism\n          flutterJSChannel.postMessage(sessionState)\n        });\n      });\n\n      clear.addEventListener(\"click\", function(event) {\n        event.preventDefault();\n        checkout.clearForm(function() {});\n      });\n    }\n  );\n})();\n"},"children":[]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"tips-for-android-emulators","__idx":4},"children":["Tips for Android emulators"]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Tips for Android emulators"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["On Android emulator devices, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["localhost"]}," points to the emulated device. If you want the iframe to load a page hosted in your local environment you must use the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["10.0.2.2"]}," IP address. More information is available on the official ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://developer.android.com/studio/run/emulator-networking"},"children":["Android Emulator networking"]}," page."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The use of the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https"]}," protocol has been enforced since Android 6.0. As this can be impractical for local development, you can configure an exception to allow plain text http on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["10.0.2.2"]},". Note that this is for development only, and that you ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["must"]}," always use https in Production."]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Create a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["network_config.xml"]}," in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["res/xml"]}," folder with the following content:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"xml","header":{"controls":{"copy":{}}},"source":" <?xml version=\"1.0\" encoding=\"utf-8\"?>\n <network-security-config>\n   <domain-config cleartextTrafficPermitted=\"true\">\n     <domain includeSubdomains=\"true\">10.0.2.2</domain>\n   </domain-config>\n </network-security-config>\n","lang":"xml"},"children":[]},{"$$mdtype":"Tag","name":"ol","attributes":{"start":2},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Configure your Android app to use this file as network security configuration by adding the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["android:networkSecurityConfig=\"@xml/network_config\""]}," attribute to the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["<application>"]}," node of your ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AndroidManifest.xml"]}," file."]}]}]}]},"headings":[{"value":"Flutter integration with Web SDK","id":"flutter-integration-with-web-sdk","depth":1},{"value":"Overview","id":"overview","depth":2},{"value":"Integration","id":"integration","depth":2},{"value":"Full integration example","id":"full-integration-example","depth":3},{"value":"Tips for Android emulators","id":"tips-for-android-emulators","depth":3}],"frontmatter":{"seo":{"title":"Flutter integration with Web SDK"}},"lastModified":"2025-09-22T09:15:26.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/products/checkout/flutter/web-sdk","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}