{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-platform/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Flutter SDK - Changelog","llmstxt":{"title":"Glomopay developer documentation","description":"Cross-border payments APIs, organised by product. Each product section carries both the explanation of its objects and the job-shaped integration guides that set them up.","details":{"content":"How to use these docs:\n\n- Get started is the front door. It carries a routing table from\n  \"what are you building\" to the page that builds it, plus how to get\n  API keys.\n- The product sections - Payin, Payout, Multi-currency accounts,\n  Verification, Request for Information (RFI) - each hold two kinds of page.\n  Pages titled as a noun (\"Subscriptions\", \"Bank Transfer\") explain what\n  an object is. Pages titled as a job (\"Set up recurring subscriptions\",\n  \"Collect LRS remittances from India\") are complete integration flows\n  and live one level under the object they set up. Match a user's goal\n  against the job-shaped titles first.\n- Reports and Identity and Access Management are the two subjects with no\n  API counterpart. There are no endpoints for reports, users, roles or\n  invites; both pages document the merchant dashboard. A dashboard\n  procedure for something the API also does (a refund, a payout) is NOT\n  here - it stays in the product that owns it.\n- API reference is generated from OpenAPI and carries endpoint detail.\n- The OpenAPI description itself is published as a single self-contained\n  document at /openapi.yaml, and the same document as JSON at\n  /openapi.json. Every $ref is resolved into it, so one fetch is the\n  whole contract: 61 paths, 81 operations, 68 schemas - the same\n  endpoints the API reference pages render. Fetch that instead of\n  reading the 129 pages under /api-reference/.\n- Developer resources covers what every integration touches and no single\n  product owns: auth, errors, pagination, rate limits, webhooks,\n  versioning, supported countries, quotes, and the client SDKs.\n"},"sections":[{"title":"Get started","description":"The front door. The routing table from a merchant's goal to the flow that delivers it, how to obtain API keys, and the platform glossary.","includeFiles":["**/get-started/**"]},{"title":"Payin","description":"Collecting money: customers, orders, checkout, payment links, payment methods (cards, bank transfer, pay via bank), refunds, disputes, purpose codes, fee models, custom fields, subscriptions, and resident India remittance under LRS. Includes the flows that set each up - bank transfers, subscriptions, LRS remittances, and server-to-server card payments.","includeFiles":["**/payin/**"]},{"title":"Payout","description":"Sending money: the payout life cycle, queued payouts, creating and cancelling a payout, rails, beneficiaries, purpose codes, and the action required state.","includeFiles":["**/payout/**"]},{"title":"Multi-currency accounts","description":"Holding money: balances, balance conversion, adding balance, withdrawing balance, and the settlement holiday calendar - the Indian and US bank and FX holidays on which settlement to the merchant's bank account, and money movement generally, is affected.","includeFiles":["**/multi-currency-account/**"]},{"title":"Verification","description":"Proving who someone is and that an account is theirs: KYC, bank account validation, and third-party verification (TPV) with the flow that verifies a payer's bank account.","includeFiles":["**/verification/**"]},{"title":"Request for Information (RFI)","description":"Responding to a compliance request for information, per object - payment link, order, payment, payout - plus compliance reviews and RFIs raised on already-successful payments.","includeFiles":["**/request-for-information/**"]},{"title":"Reports","description":"The downloadable and scheduled reports a merchant pulls from the dashboard for reconciliation, compliance and treasury: payment, subscription, settlement breakup, balance statement and KYC reports, plus scheduling one for recurring email delivery. Dashboard only - there is no reports API.","includeFiles":["**/reports/**"]},{"title":"Identity and Access Management","description":"Administering who can use a merchant account: one set of credentials across multiple MIDs, switching between them without logging out, the Admin / Member / Sales Partner roles and what each may see and do, and inviting a new member. Dashboard only - there is no users, roles or invites API.","includeFiles":["**/access-management/**"]},{"title":"API reference","description":"Endpoint reference generated from the Glomopay OpenAPI description.","includeFiles":["**/api-reference/**"]},{"title":"Developer resources","description":"What every integration touches and no single product owns: auth, errors, pagination, rate limits, webhooks, versioning, API validations, security, supported countries, quotes, and the client SDKs - React Native, Flutter, Android and the Unified Web SDK, with per-version references and changelogs. Reports and Identity and Access Management used to be listed here and are now their own sections.","includeFiles":["**/platform/**"]}]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"flutter-sdk---changelog","__idx":0},"children":["Flutter SDK - Changelog"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["All notable changes to the GlomoPay Flutter SDK."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The format is based on ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://keepachangelog.com/en/1.0.0/"},"children":["Keep a Changelog"]},"."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The canonical changelog ships with the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://pub.dev/packages/glomopay_sdk"},"children":["pub.dev package"]},". This page mirrors it for convenience."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"210","__idx":1},"children":["2.1.0"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A feature release. No API changed and no integration needs a code change - upgrade the version constraint and rebuild."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"added","__idx":2},"children":["Added"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Document downloads in bank flows."]}," Bank flows that offer a form or a signed agreement to download now hand it to the system save dialog with the filename pre-filled, and the user chooses where it goes - ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ACTION_CREATE_DOCUMENT"]}," on Android, the document picker on iOS. Previously the control did nothing: a WebView cannot write a file to the device on its own, and the tap produced no file, no error and no event. Nothing to integrate - no callback, no configuration, no permission, and no new dependency. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/flutter-sdk/v2#document-downloads"},"children":["Document Downloads"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["A failed download now tells the user and the host app."]}," A dismissible dialog names what went wrong, and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onSdkError"]}," fires with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SdkErrorType.validationError"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["field"]}," set to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["'file.save'"]}," - filter on that field to tell it apart from other validation errors. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["This never ends the checkout"]},"; the user can carry on. A user who cancels the save dialog is not a failure and is reported as neither."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Downloads larger than 100 MB are declined rather than attempted. The save dialog takes the bytes rather than a path, so the whole document is held in memory to hand over, and something larger would take the host app down with it. Oversized responses are refused mid-download and never buffered whole."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Improved error tracking and SDK diagnostics."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Part of the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/flutter-sdk/v2"},"children":["v2 documentation"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"200","__idx":3},"children":["2.0.0"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Upgrading from v1.11.x? See the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/flutter-sdk/migration"},"children":["Migration Guide"]},". Every integration needs at least one change - the new required ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onUserJourneyCompleted"]}," callback - and the compiler points at it."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"breaking","__idx":4},"children":["Breaking"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["New required callback ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onUserJourneyCompleted"]}," - the second happy path."]}," Fires when the user completes the bank transfer flow. This previously arrived as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPaymentSuccess"]}," with a payload whose ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["paymentId"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["signature"]}," were both null - a payment reported as received, but nothing for your backend to verify it against. It now arrives as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onUserJourneyCompleted"]}," with a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoPayUserJourneyPayload"]}," carrying ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["journeyType"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["orderId"]}," and the transfer details the page sent, and ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["no longer reaches ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPaymentSuccess"]}]},". If ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPaymentSuccess"]}," currently special-cases a null ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["paymentId"]},", that branch should move to the new callback."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPaymentFailure"]}," is now reserved for backend-confirmed payment failures."]}," Errors no longer route there: a checkout that could not load, a connection failure or an internal fault reach ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onSdkError"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onConnectionError"]}," instead, and a user exiting one of the SDK's default error screens ends the checkout through ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPaymentTerminate"]}," (source ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["userDismiss"]},"). If closing the checkout or running cleanup was handled inside ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPaymentFailure"]},", replicate it on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPaymentTerminate"]}," so no user is left stranded after the upgrade."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Removed some legacy integration options which were not suitable for production builds."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Global error handlers are no longer installed in the host app."]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FlutterError.onError"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PlatformDispatcher.instance.onError"]}," and the native crash handlers are left alone. If your app inherited SDK-installed handlers, it loses them at this upgrade - install your own. In exchange, the SDK no longer constrains versions for any error-tracking package."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onEvent"]}," is deprecated"]}," and will be removed in a future major version. It carries internal events that are subject to change and were never part of the SDK's API contract; the lifecycle callbacks remain the supported integration. If you consume ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onEvent"]}," or supply your own ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoPayController"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["addEventListener"]},", contact the Glomo mobile team for the event mapping before upgrading."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"fixed","__idx":5},"children":["Fixed"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Backend-confirmed payment failures now reach ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPaymentFailure"]},"."]}," They were being checked against the rule written for a payment ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["success"]},", which requires a signature that a failure payload has never carried - so every confirmed decline was discarded before reaching the host app, in every release build."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed the SDK's default error screens that could not be dismissed. Their buttons no longer take their colours from the host app's theme, so an app theme can no longer hide the exit. Applies to both the default checkout error and connection error dialogs."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Dismissing a connection error now closes the checkout rather than leaving the user stuck in loading. On Android the system back button does the same, instead of closing the error and leaving the checkout stranded."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Error callbacks now fire independently of the default dialog being dismissed, so host apps are always informed about what went wrong even if the dialog is never closed."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Each failure now reports its actual semantic, and only once. A single checkout loading failure fires ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onConnectionError"]}," alone - it used to fire ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onSdkError"]}," as well."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed successful payments being overridden when a load-timeout error had already been reported. A payment completed on a slow checkout that recovered midway now correctly reports ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPaymentSuccess"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The back button is no longer locked while a payment is in progress. Previously a page that stopped responding mid-payment could leave users stuck until payment confirmation arrived."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The checkout page's own close control now works in every state. It stopped working once the page had reported a payment as pending, which every bank hand-off does."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Every payment failure the checkout page reports now reaches ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPaymentFailure"]},", including the thinner shape the page emits for its own setup failures. The page's own detail travels untouched in the payload's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["rawResponse"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"changed","__idx":6},"children":["Changed"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CheckoutStatus"]}," gained ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["bankTransferSubmitted"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["error"]},". A submitted bank transfer used to leave the status at ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["paymentSuccessful"]},"; a checkout that could not proceed with no payment attempted used to be reported as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["paymentFailed"]},". Both new members are ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["appended"]},", so existing members keep the indices they shipped with - only an exhaustive ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["switch"]}," needs new arms."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPaymentTerminate"]}," is now a notification rather than a handover. The SDK closes the checkout itself whether or not a callback is supplied, and will not close a second time if you also close from the callback."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The load-timeout ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onConnectionError"]}," is now advisory: the network may still recover, so the SDK does not close itself on it (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["shouldAutoClose"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["false"]},"). Prefer not to tear the checkout down on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ConnectionErrorType.timeout"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The SDK no longer draws its own default error screen when the checkout page reports a failure of its own, since the page already renders one. The page's events continue to reach ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onEvent"]}," exactly as before."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your app is told about one ending per checkout. A backend-confirmed payment result is the ending, so a user closing what remains afterwards no longer also delivers ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPaymentTerminate"]}," for the same journey."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["File uploads are no longer restricted by file type. The SDK now relies on the bank's own guidance - whatever the bank's pages ask for can be selected, including formats the picker previously greyed out."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Internal event handling has been revamped, refactored and cleaned up. Recommended integrations are unaffected, as these events were never part of the SDK's API contract."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["path_provider"]}," is now a direct dependency (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["^2.0.0"]},")."]}," It was already resolved transitively, so no new package enters the dependency graph, but the constraint is now the SDK's own and may affect resolution in a pinned host app."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"added-1","__idx":7},"children":["Added"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["SDK diagnostics are spooled to the application support directory and flushed on the next initialisation, so a checkout interrupted by process death is still reported. The SDK writes only its own diagnostics there, and no payment data."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Improved error tracking and SDK diagnostics throughout. Merchant integrations can now freely use their own error-tracking dependencies without version restrictions."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Part of the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/flutter-sdk/v2"},"children":["v2 documentation"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"1112","__idx":8},"children":["1.11.2"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed the flicker where a bank's 2FA page intermittently disappeared and the checkout screen showed through beneath it."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed bank pages rendering blank on Android immediately after the page loaded (zero-width layout bug)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed the iOS software keyboard being dismissed the instant a bank 2FA card or OTP field was focused."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["On iOS, bank pages that manage text selection and caret behaviour in their own card or OTP fields are now honoured instead of overridden. Long-press paste into an empty field is unaffected."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Rendering of bank pages in redirect chains optimized with several performance enhancements."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Transient failures of the native bridge are now handled resiliently."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["UI elements with educational content are no longer created when there is nothing to render."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Part of the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/flutter-sdk/v1"},"children":["v1 documentation (Archived)"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"1111","__idx":9},"children":["1.11.1"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added support for banks with breaking changes in remittance flows."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Nested ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["window.open"]}," redirects and back button navigations are now handled from within bank flows."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"1110","__idx":10},"children":["1.11.0"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added camera/gallery/file picker for images and PDFs, fixing bank flows where document uploads were unusable."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onUserRefusedDevicePermissions"]}," callback on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoPayCheckout"]}," - fires when the user denies camera/storage permissions during file/document uploads or selfie verification requests."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["File upload fallback improvements: bottom sheet is shown when accept types include non-image formats, and camera permission denial now falls back gracefully instead of returning empty."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"1104","__idx":11},"children":["1.10.4"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Bug fixes."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"1100","__idx":12},"children":["1.10.0"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Package version dependency fixed."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"109","__idx":13},"children":["1.0.9"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fix auto scroll bottom to top issue for iOS."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"108","__idx":14},"children":["1.0.8"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Removed the aggressive auto-scroll handler from iOS WebView injection to reduce conflicts with bank pages."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"107","__idx":15},"children":["1.0.7"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Updated ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["safe_device"]}," to resolve Android ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["checkTestKeys()"]}," compile issue."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"106","__idx":16},"children":["1.0.6"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Device compatibility fix."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"105","__idx":17},"children":["1.0.5"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Pinned ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["safe_device"]}," to the fixed 1.4.x line to resolve Android compile issues and maintain cross-platform build stability."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"104","__idx":18},"children":["1.0.4"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Bug fixes."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["On iOS, the SDK will now open glomo checkout within a modal."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Part of the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/flutter-sdk/v1"},"children":["v1.0.4 documentation"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"103","__idx":19},"children":["1.0.3"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Bug fixes."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"102","__idx":20},"children":["1.0.2"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Bug fixes."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"101","__idx":21},"children":["1.0.1"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["iOS copy/paste fix for input fields in checkout pages."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Credentialed fetch/XHR support for WKWebView session handling."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"100","__idx":22},"children":["1.0.0"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Major stable release. Versioned for pub.dev."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["No functional API changes."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Part of the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/flutter-sdk/v1"},"children":["v1.0.4 documentation"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"0016","__idx":23},"children":["0.0.16"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added subscription checkout support via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["subscriptionId"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Validation requires exactly one checkout identifier: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["orderId"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["subscriptionId"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Subscription checkouts reuse standard checkout flow, skip order detection API calls."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Existing order-based integrations remain backward compatible."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"0015","__idx":24},"children":["0.0.15"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed iOS UI issue where software keyboard caused bottom UI elements to overlap input fields."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Part of the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/flutter-sdk/v0.0.15"},"children":["v0.0.15 documentation"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"0014","__idx":25},"children":["0.0.14"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added support for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payment.bank_transfer_submitted"]}," event, treated identically to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payment.success"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Relaxed payload validation for bank transfers to require only ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["orderId"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Relaxed device compliance checks for development environments."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enforced strict root and jailbreak detection across all modes."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"0013","__idx":26},"children":["0.0.13"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Internal improvements."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Part of the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/flutter-sdk/v0.0.13"},"children":["v0.0.13 documentation"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"0012","__idx":27},"children":["0.0.12"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Resolved bank-specific compatibility issues."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"0011","__idx":28},"children":["0.0.11"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Resolved WebView compatibility issues on certain Android devices."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"0010","__idx":29},"children":["0.0.10"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added 15-second render timeout for initial checkout load."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"009","__idx":30},"children":["0.0.9"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Improved LRS checkout layout."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"008","__idx":31},"children":["0.0.8"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added LRS education content for supported LRS orders. Non-LRS orders are unaffected."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"007","__idx":32},"children":["0.0.7"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added back button for redirection pages."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed SDK unresponsiveness on loading screen; now displays error dialog and triggers ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPaymentFailure"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"006","__idx":33},"children":["0.0.6"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Minimum Flutter SDK bumped to 3.7.0."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added progress indicator to checkout loading."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added loading screen for redirect pages."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed progress indicator reset on page navigation."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"005","__idx":34},"children":["0.0.5"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed keyboard overlap on checkout input fields."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"004","__idx":35},"children":["0.0.4"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Improved redirect handling in checkout flow."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"003","__idx":36},"children":["0.0.3"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Improved checkout reliability."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Part of the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/flutter-sdk/v0.0.3"},"children":["v0.0.3 documentation"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"002","__idx":37},"children":["0.0.2"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed memory leaks in checkout lifecycle."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"001","__idx":38},"children":["0.0.1"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Initial release of GlomoPay Flutter SDK."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"related","__idx":39},"children":["Related"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/flutter-sdk/v2"},"children":["Flutter SDK v2 documentation"]}," - latest version (v2.1.0)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/flutter-sdk/migration"},"children":["Migration Guide (v1.11.x to v2.0.0)"]}," - step-by-step upgrade instructions"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/flutter-sdk/v1"},"children":["Flutter SDK v1 (Archived)"]}," - previous version documentation (v1.11.2)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/flutter-sdk/v0.0.15"},"children":["Flutter SDK v0.0.15 (Deprecated)"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/flutter-sdk/v0.0.13"},"children":["Flutter SDK v0.0.13 (Deprecated)"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/flutter-sdk/v0.0.3"},"children":["Flutter SDK v0.0.3 (Deprecated)"]}]}]}]},"headings":[{"value":"Flutter SDK - Changelog","id":"flutter-sdk---changelog","depth":1},{"value":"2.1.0","id":"210","depth":2},{"value":"Added","id":"added","depth":3},{"value":"2.0.0","id":"200","depth":2},{"value":"Breaking","id":"breaking","depth":3},{"value":"Fixed","id":"fixed","depth":3},{"value":"Changed","id":"changed","depth":3},{"value":"Added","id":"added-1","depth":3},{"value":"1.11.2","id":"1112","depth":2},{"value":"1.11.1","id":"1111","depth":2},{"value":"1.11.0","id":"1110","depth":2},{"value":"1.10.4","id":"1104","depth":2},{"value":"1.10.0","id":"1100","depth":2},{"value":"1.0.9","id":"109","depth":2},{"value":"1.0.8","id":"108","depth":2},{"value":"1.0.7","id":"107","depth":2},{"value":"1.0.6","id":"106","depth":2},{"value":"1.0.5","id":"105","depth":2},{"value":"1.0.4","id":"104","depth":2},{"value":"1.0.3","id":"103","depth":2},{"value":"1.0.2","id":"102","depth":2},{"value":"1.0.1","id":"101","depth":2},{"value":"1.0.0","id":"100","depth":2},{"value":"0.0.16","id":"0016","depth":2},{"value":"0.0.15","id":"0015","depth":2},{"value":"0.0.14","id":"0014","depth":2},{"value":"0.0.13","id":"0013","depth":2},{"value":"0.0.12","id":"0012","depth":2},{"value":"0.0.11","id":"0011","depth":2},{"value":"0.0.10","id":"0010","depth":2},{"value":"0.0.9","id":"009","depth":2},{"value":"0.0.8","id":"008","depth":2},{"value":"0.0.7","id":"007","depth":2},{"value":"0.0.6","id":"006","depth":2},{"value":"0.0.5","id":"005","depth":2},{"value":"0.0.4","id":"004","depth":2},{"value":"0.0.3","id":"003","depth":2},{"value":"0.0.2","id":"002","depth":2},{"value":"0.0.1","id":"001","depth":2},{"value":"Related","id":"related","depth":2}],"frontmatter":{"title":"Flutter SDK Changelog","seo":{"title":"Flutter SDK - Changelog"}},"lastModified":"2026-09-22T05:15:29.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/platform/sdk/flutter-sdk/changelog","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}