> ## Documentation Index
> Fetch the complete documentation index at: https://docs.chmodlab.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Flutter

> A Flutter plugin for the chmod SDK is in progress.

<Note>
  **In progress.** A Flutter plugin that wraps the native iOS and Android SDKs is under
  development. This page will carry installation, usage and configuration once it ships.

  Talk to your chmod account manager if you need it for a planned integration — timelines
  are set against real demand.
</Note>

## In the meantime

The native SDKs work in a Flutter app today through a platform channel you own. The flow
is launched from the native side and the outcome is sent back to Dart.

You would need:

<Steps>
  <Step title="Install both native SDKs">
    Follow [iOS installation](/sdk/ios/installation) and
    [Android installation](/sdk/android/installation) in the `ios/` and `android/`
    directories of your app.
  </Step>

  <Step title="Expose a MethodChannel on each platform">
    One method that takes the `sdkToken`, launches the flow, and returns the outcome. On
    Android the launch has to go through the `FlutterActivity`, which is the host for the
    `ActivityResultContract`; on iOS it presents from the Flutter view controller.
  </Step>

  <Step title="Map the result">
    Convert `completed` / `cancelled` / `failed` and the failure code into a map your Dart
    code can switch on.
  </Step>
</Steps>

The shape you are aiming for:

```dart lines theme={null}
const channel = MethodChannel('chmod_kyc');

final token = await api.startKycTransaction();

final result = await channel.invokeMapMethod<String, dynamic>('verify', {
  'baseUrl':  'https://api.chmod.com',
  'sdkToken': token,
});

switch (result!['status'] as String) {
  case 'completed':
    showUnderReview();
  case 'cancelled':
    Navigator.pop(context);
  case 'failed':
    handleFailure(result['code'] as String);
}
```

<Warning>
  Everything the native guides say still applies through a platform channel — `completed`
  does not mean approved, the token must come from your backend, and the permissions belong
  to the SDK. A wrapper does not change the contract.
</Warning>

## Meanwhile

<CardGroup cols={2}>
  <Card title="iOS SDK" icon="apple" href="/sdk/ios/installation">
    Available now.
  </Card>

  <Card title="Android SDK" icon="android" href="/sdk/android/installation">
    Available now.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.