Skip to main content

Quick Start

Get the Flutter SDK running in your app in 5 minutes.

Basic Usage

import 'package:flutter/material.dart';
import 'package:simplr_fraud/simplr_fraud.dart';

class SignupScreen extends StatefulWidget {

_SignupScreenState createState() => _SignupScreenState();
}

class _SignupScreenState extends State<SignupScreen> {
final _simplr = SimplrFraud();
final _formKey = GlobalKey<FormState>();
final _emailController = TextEditingController();
final _passwordController = TextEditingController();
bool _isLoading = false;


void initState() {
super.initState();
_simplr.initialize();
}

Future<void> _onSubmit() async {
if (!_formKey.currentState!.validate()) return;

setState(() => _isLoading = true);

try {
// Collect device + behavioral signals
final signals = await _simplr.collect(context);

// Send to your backend
final response = await http.post(
Uri.parse('https://api.yourapp.com/signup'),
headers: {'Content-Type': 'application/json'},
body: jsonEncode({
'email': _emailController.text,
'password': _passwordController.text,
'signals': signals.toJson(),
}),
);

final result = jsonDecode(response.body);

if (result['risk_level'] == 'critical') {
_showError('Unable to create account');
} else {
Navigator.pushReplacementNamed(context, '/dashboard');
}
} catch (e) {
_showError('Something went wrong');
} finally {
setState(() => _isLoading = false);
}
}

void _showError(String message) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(message)),
);
}


Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Sign Up')),
body: Padding(
padding: EdgeInsets.all(16),
child: Form(
key: _formKey,
child: Column(
children: [
SimplrTextField(
tracker: _simplr,
controller: _emailController,
fieldName: 'email',
decoration: InputDecoration(labelText: 'Email'),
keyboardType: TextInputType.emailAddress,
validator: (v) => v!.isEmpty ? 'Required' : null,
),
SizedBox(height: 16),
SimplrTextField(
tracker: _simplr,
controller: _passwordController,
fieldName: 'password',
decoration: InputDecoration(labelText: 'Password'),
obscureText: true,
validator: (v) => v!.length < 8 ? 'Min 8 characters' : null,
),
SizedBox(height: 24),
ElevatedButton(
onPressed: _isLoading ? null : _onSubmit,
child: _isLoading
? CircularProgressIndicator()
: Text('Sign Up'),
),
],
),
),
),
);
}


void dispose() {
_emailController.dispose();
_passwordController.dispose();
super.dispose();
}
}

Configuration Options

final simplr = SimplrFraud(
config: SimplrFraudConfig(
// Enable behavioral biometrics
collectBiometrics: true,

// Start tracking on init
autoStart: true,

// Debug logging
debug: false,
),
);

SDK Methods

initialize()

Initialize the SDK:

await simplr.initialize();

collect(BuildContext)

Collect all signals:

final signals = await simplr.collect(context);
// Returns CollectedSignals with device + behavior data

collectDeviceSignals(BuildContext)

Collect only device signals:

final device = await simplr.collectDeviceSignals(context);

collectBehaviorSignals()

Collect only behavioral signals:

final behavior = simplr.collectBehaviorSignals();

startTracking() / stopTracking()

Control behavioral tracking:

simplr.startTracking();
simplr.stopTracking();

reset()

Clear collected behavioral data:

simplr.reset();

Response Structure

class CollectedSignals {
final DeviceSignals device;
final BehaviorSignals behavior;
final DateTime timestamp;

Map<String, dynamic> toJson() => {
'device': device.toJson(),
'behavior': behavior.toJson(),
'timestamp': timestamp.toIso8601String(),
};
}

Next Steps