uat_larkfinserv_multi 1.0.7
uat_larkfinserv_multi: ^1.0.7 copied to clipboard
A Flutter SDK for integrating Lark FinServ's loan eligibility check functionality into your Flutter applications.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:uat_larkfinserv_multi/uat_larkfinserv_multi.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'LarkFinServ SDK Example',
theme: ThemeData(
primarySwatch: Colors.blue,
useMaterial3: true,
),
home: SDKExampleScreen(context),
);
}
}
class SDKExampleScreen extends StatefulWidget {
const SDKExampleScreen(this.context, {super.key});
final BuildContext context;
@override
State<SDKExampleScreen> createState() => _SDKExampleScreenState();
}
class _SDKExampleScreenState extends State<SDKExampleScreen> {
final LarkFinServSDK _sdk = LarkFinServSDK();
bool _isInitialized = false;
bool _isLoading = false;
String _statusMessage = 'SDK not initialized';
EligibilityResult? _eligibilityResult;
String? _errorMessage;
// Configuration - Replace with your actual API credentials
final String _apiKey = 'your_api_key_here';
final String _apiSecret = 'your_api_secret_here';
final String _phoneNumber = '+919876543210'; // Optional
final String _environment = 'sandbox'; // or 'production'
@override
void initState() {
super.initState();
_initializeSDK();
}
Future<void> _initializeSDK() async {
setState(() {
_isLoading = true;
_statusMessage = 'Initializing SDK...';
_errorMessage = null;
});
try {
final config = PartnerConfig(
apiKey: _apiKey,
apiSecret: _apiSecret,
phoneNumber: _phoneNumber,
environment: _environment,
theme: ThemeConfig(
primaryColor: '#2196F3',
secondaryColor: '#FFC107',
fontFamily: 'Roboto',
name: 'My App',
),
);
await _sdk.initialize(config);
// Listen to SDK events
_sdk.events.listen((event) {
setState(() {
switch (event.type) {
case SDKEventType.ready:
_statusMessage = 'SDK Ready';
_isInitialized = true;
break;
case SDKEventType.eligibilityResult:
_eligibilityResult = event.data?['result'] as EligibilityResult?;
_statusMessage = 'Eligibility check completed';
break;
case SDKEventType.error:
final error = event.data?['error'] as SDKError?;
_errorMessage = error?.message ?? 'Unknown error occurred';
_statusMessage = 'Error occurred';
break;
case SDKEventType.close:
_statusMessage = 'SDK closed';
break;
case SDKEventType.closeFrame:
_statusMessage = 'Frame closed';
break;
case SDKEventType.initiated:
_statusMessage = 'Eligibility check initiated';
break;
}
});
});
setState(() {
_isLoading = false;
_statusMessage = 'SDK initialized successfully';
_isInitialized = true;
});
} catch (e) {
setState(() {
_isLoading = false;
_errorMessage = e.toString();
_statusMessage = 'Failed to initialize SDK';
});
}
}
Future<void> _openEligibilityCheck() async {
if (!_isInitialized) {
_showSnackBar('Please initialize SDK first');
return;
}
try {
await _sdk.openEligibilityCheck(context, SDKMode.popup);
} catch (e) {
setState(() {
_errorMessage = e.toString();
});
_showSnackBar('Failed to open eligibility check: $e');
}
}
void _showEligibilityWidget() {
if (!_isInitialized) {
_showSnackBar('Please initialize SDK first');
return;
}
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => EligibilityCheckScreen(sdk: _sdk),
),
);
}
void _showSnackBar(String message) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(message)),
);
}
@override
void dispose() {
_sdk.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('LarkFinServ SDK Example'),
backgroundColor: Colors.blue,
foregroundColor: Colors.white,
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// Status Card
Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'SDK Status',
style: Theme.of(context).textTheme.titleLarge,
),
const SizedBox(height: 8),
Text(
_statusMessage,
style: TextStyle(
color: _isInitialized ? Colors.green : Colors.orange,
fontWeight: FontWeight.bold,
),
),
if (_isLoading)
const Padding(
padding: EdgeInsets.only(top: 8.0),
child: LinearProgressIndicator(),
),
if (_errorMessage != null) ...[
const SizedBox(height: 8),
Text(
'Error: $_errorMessage',
style: const TextStyle(color: Colors.red),
),
],
],
),
),
),
const SizedBox(height: 16),
// Action Buttons
ElevatedButton.icon(
onPressed: _isInitialized ? _openEligibilityCheck : null,
icon: const Icon(Icons.open_in_browser),
label: const Text('Open Eligibility Check (Popup)'),
),
const SizedBox(height: 8),
ElevatedButton.icon(
onPressed: _isInitialized ? _showEligibilityWidget : null,
icon: const Icon(Icons.web),
label: const Text('Show Eligibility Widget (Inline)'),
),
const SizedBox(height: 8),
ElevatedButton.icon(
onPressed: _initializeSDK,
icon: const Icon(Icons.refresh),
label: const Text('Reinitialize SDK'),
),
const SizedBox(height: 16),
// Eligibility Result
if (_eligibilityResult != null) ...[
Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Eligibility Result',
style: Theme.of(context).textTheme.titleLarge,
),
const SizedBox(height: 8),
Text('Eligible: ${_eligibilityResult!.eligible}'),
if (_eligibilityResult!.amount != null)
Text('Amount: ₹${_eligibilityResult!.amount!.toStringAsFixed(2)}'),
if (_eligibilityResult!.interestRate != null)
Text('Interest Rate: ${_eligibilityResult!.interestRate!.toStringAsFixed(2)}%'),
if (_eligibilityResult!.reasons != null && _eligibilityResult!.reasons!.isNotEmpty)
Text('Reasons: ${_eligibilityResult!.reasons!.join(', ')}'),
],
),
),
),
],
const Spacer(),
// Configuration Info
Card(
color: Colors.grey[100],
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Configuration',
style: Theme.of(context).textTheme.titleMedium,
),
const SizedBox(height: 8),
Text('API Key: ${_apiKey.substring(0, 8)}...'),
Text('Environment: $_environment'),
Text('Phone: $_phoneNumber'),
const SizedBox(height: 8),
const Text(
'Note: Replace the API credentials with your actual values from LarkFinServ.',
style: TextStyle(fontSize: 12, fontStyle: FontStyle.italic),
),
],
),
),
),
],
),
),
);
}
}
class EligibilityCheckScreen extends StatefulWidget {
final LarkFinServSDK sdk;
const EligibilityCheckScreen({
super.key,
required this.sdk,
});
@override
State<EligibilityCheckScreen> createState() => _EligibilityCheckScreenState();
}
class _EligibilityCheckScreenState extends State<EligibilityCheckScreen> {
EligibilityResult? _result;
String? _error;
@override
void initState() {
super.initState();
widget.sdk.events.listen((event) {
setState(() {
switch (event.type) {
case SDKEventType.eligibilityResult:
_result = event.data?['result'] as EligibilityResult?;
break;
case SDKEventType.error:
final error = event.data?['error'] as SDKError?;
_error = error?.message ?? 'Unknown error';
break;
case SDKEventType.close:
case SDKEventType.closeFrame:
Navigator.of(context).pop();
break;
case SDKEventType.ready:
break;
case SDKEventType.initiated:
break;
}
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Eligibility Check'),
backgroundColor: Colors.blue,
foregroundColor: Colors.white,
),
body: Column(
children: [
if (_error != null)
Container(
width: double.infinity,
padding: const EdgeInsets.all(16),
color: Colors.red[100],
child: Text(
'Error: $_error',
style: const TextStyle(color: Colors.red),
),
),
if (_result != null)
Container(
width: double.infinity,
padding: const EdgeInsets.all(16),
color: Colors.green[100],
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Eligibility Result',
style: Theme.of(context).textTheme.titleLarge,
),
const SizedBox(height: 8),
Text('Eligible: ${_result!.eligible}'),
if (_result!.amount != null)
Text('Amount: ₹${_result!.amount!.toStringAsFixed(2)}'),
if (_result!.interestRate != null)
Text('Interest Rate: ${_result!.interestRate!.toStringAsFixed(2)}%'),
],
),
),
Expanded(
child: EligibilityCheckWidget(
sdk: widget.sdk,
onEvent: (event) {
// Handle events if needed
},
),
),
],
),
);
}
}