CrossmintWalletController class final

Stateful orchestrator for Crossmint wallets in a Flutter app.

Holds the currently-loaded CrossmintWallet, exposes lifecycle operations (getWallet, createWallet, ensureLoaded, refresh, clear), surfaces OTP challenges via otp, and provides create*Wallet* convenience methods that wire a runtime wallet with a signer of your choosing (device, non-custodial, external, passkey).

Obtain one from CrossmintClient.createWalletController and pair it with CrossmintWalletHost (headless) or CrossmintWalletProvider (opt-in Material UI) so the hidden signer bridge has a place to mount.

Extends ChangeNotifier — listen to the controller for wallet-state changes. Mutations go through the controller's public API; observation can additionally go through state for a narrower, read-only surface.

Inheritance

Constructors

CrossmintWalletController({required CrossmintClient client, required CrossmintWalletControllerConfig config, CrossmintWalletStateRepository? stateRepository})
Creates a wallet controller. Prefer CrossmintClient.createWalletController over calling this directly.

Properties

client → CrossmintClient
The underlying client — exposed for code that needs direct access to sub-clients (auth, orders, credentials, etc.).
final
config → CrossmintWalletControllerConfig
The configuration this controller was built with.
final
currentWallet → CrossmintWallet?
The currently-loaded wallet, or null if none is loaded.
no setter
hashCode → int
The hash code for this object.
no setterinherited
hasListeners → bool
Whether any listeners are currently registered.
no setterinherited
onAuthRequired → CrossmintWalletAuthRequiredCallback
The auth-required callback the controller wires into every signer it builds. Exposed so apps building signers manually can share the same OTP-handling path.
no setter
otp → CrossmintWalletOtpController
OTP controller for non-custodial email/phone signer challenges.
final
otpChallengeListenable → ValueListenable<CrossmintOtpChallenge?>
Shortcut to CrossmintWalletOtpController.challengeListenable.
no setter
pendingOtpChallenge → CrossmintOtpChallenge?
Shortcut to CrossmintWalletOtpController.pendingChallenge.
no setter
requireCurrentWallet → CrossmintWallet
Returns the currently-loaded wallet or throws CrossmintWalletException when none is loaded.
no setter
runtimeType → Type
A representation of the runtime type of the object.
no setterinherited
state → CrossmintWalletStateView
Read-only observation surface for the underlying wallet state. Advanced consumers can subscribe to wallet / status changes directly via this Listenable while still routing all mutations through the controller's public API (getWallet, createWallet, refresh, clear, …).
no setter
status → CrossmintWalletStatus
Current wallet lifecycle status.
no setter

Methods

addListener(VoidCallback listener) → void
Register a closure to be called when the object changes.
inherited
clear() → Future<void>
Drops the loaded wallet and any pending OTP challenge. Call during sign-out.
createEvmWallet({CrossmintWalletApprovalSigner? signer, List<CrossmintWalletApprovalSigner> additionalSigners = const <CrossmintWalletApprovalSigner>[], CrossmintSignerConfig? recoverySigner}) → CrossmintEvmWallet
Wraps the currently-loaded wallet as a runtime CrossmintEvmWallet. Throws CrossmintWalletException if no wallet is loaded.
createEvmWalletWithDeviceSigner({required String signerLocator, String? address, DeviceSignerKeyStorage? storage, CrossmintSignerConfig? recoverySigner}) → CrossmintEvmWallet
Builds a runtime EVM wallet backed by a hardware-backed device signer. Use for low-friction, day-to-day signing with keys in Secure Enclave / Android Keystore.
createEvmWalletWithExternalWalletSigner({required String address, String? signerLocator, required CrossmintExternalWalletSignCallback onSign, CrossmintSignerConfig? recoverySigner}) → CrossmintEvmWallet
Builds a runtime EVM wallet backed by a user-owned external wallet (e.g. MetaMask). The caller supplies onSign to perform signatures.
createEvmWalletWithNonCustodialSigner({required String signerType, required String signerLocator, String? address, HiddenSignerBridge? bridge, CrossmintOtpDeliveryChannel? channel, CrossmintSignerConfig? recoverySigner}) → CrossmintEvmWallet
Builds a runtime EVM wallet backed by a non-custodial email/phone signer. Requires CrossmintWalletHost (or CrossmintWalletProvider) mounted in the widget tree.
createEvmWalletWithPasskeySigner({String? id, required Future<CrossmintPasskeySignResult> onSign(String message), CrossmintSignerConfig? recoverySigner}) → CrossmintEvmWallet
Builds a runtime EVM wallet backed by a passkey signer.
createSolanaWallet({CrossmintWalletApprovalSigner? signer, List<CrossmintWalletApprovalSigner> additionalSigners = const <CrossmintWalletApprovalSigner>[], CrossmintSignerConfig? recoverySigner}) → CrossmintSolanaWallet
Wraps the currently-loaded wallet as a runtime CrossmintSolanaWallet. On Solana, device signer support depends on the wallet type and is validated server-side. A default device signer is not auto-injected for Solana; it is registered reactively and falls back to the recovery signer when the server rejects it.
createSolanaWalletWithExternalWalletSigner({required String address, String? signerLocator, required CrossmintExternalWalletSignCallback onSign, CrossmintSignerConfig? recoverySigner}) → CrossmintSolanaWallet
Builds a runtime Solana wallet backed by a user-owned external wallet.
createSolanaWalletWithNonCustodialSigner({required String signerType, required String signerLocator, String? address, HiddenSignerBridge? bridge, CrossmintOtpDeliveryChannel? channel, CrossmintSignerConfig? recoverySigner}) → CrossmintSolanaWallet
Builds a runtime Solana wallet backed by a non-custodial email/phone signer. Requires a mounted wallet host.
createSolanaWalletWithPasskeySigner({String? id, required Future<CrossmintPasskeySignResult> onSign(String message), CrossmintSignerConfig? recoverySigner}) → CrossmintSolanaWallet
Builds a runtime Solana wallet backed by a passkey signer. See createEvmWalletWithPasskeySigner for passkey selection semantics.
createStellarWallet({CrossmintWalletApprovalSigner? signer, List<CrossmintWalletApprovalSigner> additionalSigners = const <CrossmintWalletApprovalSigner>[], CrossmintSignerConfig? recoverySigner}) → CrossmintStellarWallet
Wraps the currently-loaded wallet as a runtime CrossmintStellarWallet.
createStellarWalletWithDeviceSigner({required String signerLocator, String? address, DeviceSignerKeyStorage? storage, CrossmintSignerConfig? recoverySigner}) → CrossmintStellarWallet
Builds a runtime Stellar wallet backed by a hardware device signer.
createStellarWalletWithExternalWalletSigner({required String address, String? signerLocator, required CrossmintExternalWalletSignCallback onSign, CrossmintSignerConfig? recoverySigner}) → CrossmintStellarWallet
Builds a runtime Stellar wallet backed by a user-owned external wallet.
createStellarWalletWithNonCustodialSigner({required String signerType, required String signerLocator, String? address, HiddenSignerBridge? bridge, CrossmintOtpDeliveryChannel? channel, CrossmintSignerConfig? recoverySigner}) → CrossmintStellarWallet
Builds a runtime Stellar wallet backed by a non-custodial email/phone signer. Requires a mounted wallet host.
createStellarWalletWithPasskeySigner({String? id, required Future<CrossmintPasskeySignResult> onSign(String message), CrossmintSignerConfig? recoverySigner}) → CrossmintStellarWallet
Builds a runtime Stellar wallet backed by a passkey signer. See createEvmWalletWithPasskeySigner for passkey selection semantics.
createWallet(CrossmintWalletCreateRequest request) → Future<CrossmintWallet>
Creates a new wallet and stores it in controller state. Validates passkey signers up-front via crossmintValidatePasskeySigners and fires CrossmintWalletLifecycleCallbacks.onWalletCreationStart if set.
dispose() → void
Discards any resources used by the object.
override
ensureLoaded() → Future<CrossmintWallet?>
Ensures a wallet is loaded, creating one if configured to do so.
getWallet(CrossmintWalletLookupRequest request) → Future<CrossmintWallet?>
Looks up an existing wallet and stores the result in controller state. Returns null when no wallet matches. Listeners fire on state changes.
loadWallet(CrossmintWalletLookupRequest request) → Future<CrossmintWallet?>
Deprecated: use getWallet instead.
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
notifyListeners() → void
Call all the registered listeners.
inherited
refresh() → Future<CrossmintWallet?>
Re-fetches the currently-loaded wallet from the API. Returns null when nothing is loaded.
rejectOtp([Object? error]) → void
Shortcut to CrossmintWalletOtpController.reject.
removeListener(VoidCallback listener) → void
Remove a previously registered closure from the list of closures that are notified when the object changes.
inherited
sendOtp() → Future<void>
Shortcut to CrossmintWalletOtpController.sendOtp.
toString() → String
A string representation of this object.
inherited
verifyOtp(String otpCode) → Future<void>
Shortcut to CrossmintWalletOtpController.verifyOtp.

Operators

operator ==(Object other) → bool
The equality operator.
inherited