Skip to main content

Embedded Wallets SDK for Flutter

Overview

MetaMask Embedded Wallets SDK (formerly Web3Auth Plug and Play/ W3A PnP) provides a seamless authentication experience for Flutter applications with social logins, external wallets, and more. Using our Flutter SDK written in Dart, you can easily connect users to their preferred wallets and manage authentication state across both iOS and Android platforms.

Requirements

  • Android API version 26 or newer
  • iOS 14, Xcode 12+ and Swift 5.x
  • Basic knowledge of Dart and Flutter Development

Installation

To install the Web3Auth Flutter package, you have two options. You can either manually add the package in the pubspec.yaml file, or you can use the flutter pub add command.

Add via pubspec.yaml

Add web3auth_flutter as a dependency to your pubspec.yaml:

dependencies:
web3auth_flutter: ^6.1.2

Add via flutter pub add

Add web3auth_flutter using flutter pub add command:

flutter pub add web3auth_flutter

Setup

info

Prerequisites Before you start, make sure you have registered on the Web3Auth Dashboard and have set up your project. You can look into the Dashboard Setup guide to learn more.

1. Android Configuration

Once we have installed Web3Auth Flutter SDK, we also need to add the configuration for Android.

Update compileSdkVersion

For Android build compileSdkVersion needs to be 34. Check your app module gradle file in your project to change it:

android {
namespace "com.example.app_name"
compileSdkVersion 34
// ..
}

Add Web3Auth to Gradle

In your project-level gradle file add JitPack repository:

dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven { url "https://jitpack.io" } // <-- Add this line
}
}

Update Permissions

Open your app's AndroidManifest.xml file and add the following permission. Please make sure the <uses-permission> element should be a direct child of the <manifest> root element:

<uses-permission android:name="android.permission.INTERNET" />

Open your app's AndroidManifest.xml file and add the following deep link intent filter to your Main activity:

<intent-filter>
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data android:scheme="{scheme}" android:host="{YOUR_APP_PACKAGE_NAME}"/>
<!-- Accept URIs: w3a://com.example.w3aflutter -->
</intent-filter>

Handle Custom Tabs

For Android, you need to handle custom tabs lifecycle to trigger login exceptions. The Android SDK uses chrome custom tabs, and it's not possible to add a listener directly to the chrome custom tab close button to trigger login exceptions.

class LoginScreen extends StatefulWidget {

_LoginScreenState createState() => _LoginScreenState();
}

class _LoginScreenState extends State<LoginScreen> with WidgetsBindingObserver {

void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}


void dispose() {
super.dispose();
WidgetsBinding.instance.removeObserver(this);
}


void didChangeAppLifecycleState(final AppLifecycleState state) {
// This is important to trigger the user cancellation on Android.
if (state == AppLifecycleState.resumed) {
Web3AuthFlutter.setCustomTabsClosed();
}
}
}

2. iOS Configuration

Update global iOS platform

For iOS build global platform needs to be 14.0. Check Podfile in your project to change the global platform:

platform :ios, '14.0'

3. Configure Redirection

  • Go to Web3Auth Developer Dashboard, and create or open an existing Web3Auth project.
  • For iOS, whitelist {bundleId}://auth in the developer dashboard. This step is mandatory for the redirect to work.

Initialize Web3Auth

1. Configure Web3Auth Instance

Import and configure Web3Auth in your Flutter application:

main.dart
import 'package:web3auth_flutter/web3auth_flutter.dart';
import 'package:web3auth_flutter/enums.dart';
import 'package:web3auth_flutter/input.dart';
import 'package:web3auth_flutter/output.dart';
import 'dart:io';

Future<void> initWeb3Auth() async {
late final Uri redirectUrl;

if (Platform.isAndroid) {
redirectUrl = Uri.parse('{SCHEME}://{HOST}/auth');
// w3a://com.example.w3aflutter/auth
} else {
redirectUrl = Uri.parse('{bundleId}://auth');
// com.example.w3aflutter://auth
}

await Web3AuthFlutter.init(Web3AuthOptions(
clientId: "YOUR_CLIENT_ID", // Get your Client ID from Web3Auth Dashboard
network: Network.sapphire_mainnet, // or Network.sapphire_devnet
redirectUrl: redirectUrl,
));
}

2. Initialize Web3Auth Instance

Initialize the Web3Auth instance and check for existing sessions:

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
String _result = '';
bool logoutVisible = false;


void initState() {
super.initState();
initPlatformState();
}

Future<void> initPlatformState() async {
await initWeb3Auth();

try {
// Initialize and check for existing session
await Web3AuthFlutter.initialize();
final privateKey = await Web3AuthFlutter.getPrivKey();

if (privateKey.isNotEmpty) {
setState(() {
logoutVisible = true;
_result = 'Existing session found';
});
}
} catch (e) {
print('Error: $e');
}
}
}
note

After configuring Web3Auth, the next step is to initialize it using the initialize method. This method is essential for setting up the SDK, checking for any active sessions, and fetching the whitelabel configuration from your dashboard.

If the API call to fetch the project configuration fails, the method will throw an error.

Advanced Configuration

The Web3Auth Flutter SDK offers a rich set of advanced configuration options:

tip

Head over to the advanced configuration sections to learn more about each configuration option.

await Web3AuthFlutter.init(Web3AuthOptions(
clientId: "YOUR_CLIENT_ID",
network: Network.sapphire_mainnet, // or Network.sapphire_devnet
redirectUrl: redirectUrl,
));

Blockchain Integration

Web3Auth is blockchain agnostic, enabling integration with any blockchain network. Out of the box, Web3Auth offers robust support for both Solana and Ethereum.

Ethereum Integration

For Ethereum integration, you can get the private key and use it with web3dart or other Ethereum libraries:

import 'package:web3dart/web3dart.dart';

// Use your Web3Auth instance to get the private key
final privateKey = await Web3AuthFlutter.getPrivKey();

// Generate the Credentials
final credentials = EthPrivateKey.fromHex(privateKey);

// Get the address
final address = credentials.address;

// Create the Web3Client instance using your RPC URL
final client = Web3Client("YOUR_RPC_URL", Client());

// Get the balance
final balanceResponse = await client.getBalance(address);

// Convert the balance to ether format, and round off to 4 decimal places.
final balance = balanceResponse.getValueInUnit(EtherUnit.ether).toStringAsFixed(4);

Solana Integration

For Solana integration, you can get the Ed25519 private key:

import 'dart:math';
import 'package:solana/solana.dart';
import 'package:web3auth_flutter/web3auth_flutter.dart';

// Use your Web3Auth instance to get the ED25519 private key
final privateKey = await Web3AuthFlutter.getED25519PrivKey();

// Generate the KeyPair
final keyPair = await Ed25519HDKeyPair.fromPrivateKeyBytes(
privateKey: privateKey,
);

// Get the address
final address = keyPair.address;

// Create the SolanaClient instance using Solana RPC URL
final client = SolanaClient(
rpcUrl: Uri.parse('https://api.devnet.solana.com'),
websocketUrl: Uri.parse('ws://api.devnet.solana.com'),
);

// Get the balance
final balanceResponse = await client.rpcClient.getBalance(address);

// Convert the balance from lamports to SOL, and round off to 4 decimal places
final balance = (balanceResponse.value / pow(10, 9)).toStringAsFixed(4);