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

# CrossmintEmailSignIn

> Flutter Class

**Class**

Email sign-in widget with OTP verification, matching the official Crossmint RN SDK email auth flow.

```dart theme={null}
class CrossmintEmailSignIn extends StatefulWidget
```

Step 1: email input → calls `CrossmintAuthClient.sendEmailOtp`.
Step 2: 6-char OTP code → calls `CrossmintAuthClient.confirmEmailOtp`.

The state machine lives in `CrossmintEmailSignInViewModel`, which can be
supplied via `viewModel` for testing or to share state with a custom UI.
When omitted, the widget constructs and owns its own view model for the
duration of its `State` lifetime.

## Constructors

### CrossmintEmailSignIn

```dart theme={null}
const CrossmintEmailSignIn({
  super.key,
  required this.auth,
  this.viewModel,
  this.otpTitle,
  this.onAuthenticated,
  this.onError,
})
```

## Properties

### auth

```dart theme={null}
final CrossmintAuthClient auth
```

### viewModel

```dart theme={null}
final CrossmintEmailSignInViewModel? viewModel
```

Optional view model override. When `null`, the widget constructs a fresh `CrossmintEmailSignInViewModel` bound to `auth` and disposes it with the widget. When provided, the widget observes the view model but does not dispose it — the caller owns the lifecycle.

### otpTitle

```dart theme={null}
final String? otpTitle
```

Custom title for the OTP verification step. Defaults to `'Check your email'`.

### onAuthenticated

```dart theme={null}
final VoidCallback? onAuthenticated
```

### onError

```dart theme={null}
final void Function(Object error)? onError
```

## Methods

### createState

```dart theme={null}
State<CrossmintEmailSignIn> createState()
```
