## Flutter advanced setup In this guide, you'll find an overview and best practices for enabling advanced features and using built in functions for biometric authentication (passkeys) and step-up. ### Custom loader iOS To customize the loader for iOS when using Embedded mode, you can set up a custom loader by modifying your `AppDelegate.swift` file. The custom loader will be displayed during authentication processes. First, ensure that Embedded mode is enabled in your configuration. ```xml embeddedMode ... ``` br Here's how to implement a custom loader: ```swift import SwiftUI import FronteggSwift @main @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { ... // Setup Loader for Frontegg Embedded Loading // Can be any view DefaultLoader.customLoaderView = AnyView(Text("Loading...")) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } ... } ``` ### Custom loader Android To customize the loader for Android when using Embedded Activity mode, you can set up a custom loader by modifying your `MainActivity.kt` file. The custom loader will be displayed during authentication processes. First, ensure that Embedded Activity mode is enabled in your configuration. Here's how to implement a custom loader: br ```groovy import android.content.res.ColorStateList import android.graphics.Color import android.os.Bundle import android.widget.ProgressBar import com.frontegg.android.ui.DefaultLoader import io.flutter.embedding.android.FlutterActivity class MainActivity : FlutterActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Setup Loader for Frontegg Embedded Activity Loading DefaultLoader.setLoaderProvider { // Can be any view val progressBar = ProgressBar(it) val colorStateList = ColorStateList.valueOf(Color.GREEN) progressBar.indeterminateTintList = colorStateList progressBar } } } ``` ### Step-up authentication Step-up authentication allows you to temporarily elevate a user's authentication level to perform sensitive actions. This is useful for operations like updating credentials, accessing confidential data, or performing secure transactions. `maxAge` (optional): How long the elevated session is considered valid, in seconds. `completion`: A closure called after authentication finishes. If step-up fails, it receives an error. #### `stepUp` - Starts the step-up authentication flow. This will usually trigger a stronger authentication method ( e.g. biometric, MFA, etc). ``` await stepUp(maxAge: Duration(minutes: 5)); ``` #### `isSteppedUp` - This method checks if the user has recently completed a step-up authentication and whether it is still valid. br ``` final isElevated = await isSteppedUp(maxAge: Duration(minutes: 5)); if (isElevated) { // Proceed with sensitive action } else { // Prompt user to step up } ``` br **Example:** br ``` Future performSensitiveAction() async { final steppedUp = await isSteppedUp(maxAge: Duration(minutes: 5)); if (!steppedUp) { await stepUp(maxAge: Duration(minutes: 5)); } // Continue with the sensitive action } ``` ### Frontegg Flutter API Reference #### Properties | Property | Description | | --- | --- | | `currentState` | Gets the current state of the Frontegg instance. Returns a `FronteggState` which includes information such as authentication status, loading status, and user details. | | `stateChanged` | A stream that emits changes to the FronteggState. Provides real-time updates on the state of authentication, user details, and loading statuses. | #### Methods ##### Authentication methods | Method | Parameters | Description | | --- | --- | --- | | `login` | `loginHint` (optional): String | Initiates the authentication process. `loginHint` pre-fills the login field in the Frontegg Login Box. | | `loginWithPasskeys` | None | Authenticates the user using passkeys. | | `registerPasskeys` | None | Registers passkeys for the user. | | `logout` | None | Logs out the user and clears user-related data. | | `refreshToken` | None | Refreshes the authentication token if needed. Returns `true` if successful. | ##### Social & direct login methods | Method | Parameters | Description | | --- | --- | --- | | `directLogin` | - `url` (required): String- `ephemeralSession`: bool = true- `additionalQueryParams`: Map? | Initiates a direct login using a provided URL. | | `socialLogin` | - `provider` (required): FronteggSocialProvider- `ephemeralSession`: bool = true- `additionalQueryParams`: Map? | Initiates a social login using the specified provider (e.g., Google, Facebook). | | `customSocialLogin` | - `id` (required): String- `ephemeralSession`: bool = true- `additionalQueryParams`: Map? | Initiates a custom social login using a unique identifier. | ##### Account (tenant) management | Method | Parameters | Description | | --- | --- | --- | | `switchTenant` | `tenantId` (required): String | Switches the user's active tenant. IDs available from `User.tenants.tenantId`. | ##### Authorization & security | Method | Parameters | Description | | --- | --- | --- | | `requestAuthorize` | - `refreshToken` (required): String- `deviceTokenCookie`: String? | Initiates authorization request. Returns `FronteggUser` if successful, `null` if fails. | | `isSteppedUp` | `maxAge`: Duration? | Checks if user has completed step-up authentication. | | `stepUp` | `maxAge`: Duration? | Initiates the step-up authentication process. | ##### Utility methods | Method | Parameters | Description | | --- | --- | --- | | `dispose` | None | Cancels the subscription to the state stream. Call when object is no longer needed. | | `getConstants` | None | Fetches the Frontegg constants containing configuration values. Returns `FronteggConstants`. | ##### Error handling All methods can throw a `FronteggException` for platform-specific errors. The error handling system automatically converts platform exceptions to `FronteggException` instances. ##### Common error scenarios: - Authentication failures - Network connectivity issues - Invalid parameters - Platform-specific errors