spare_link 0.1.0-beta.3
spare_link: ^0.1.0-beta.3 copied to clipboard
Flutter SDK for Spare's redirect-based open-banking payment flows. Provides bank selection, consent orchestration, crash-safe session recovery, and sandbox/production support for KSA, UAE, and BAH.
example/lib/main.dart
// ignore_for_file: avoid_print
import 'package:flutter/material.dart';
import 'package:spare_link/spare_link.dart';
void main() => runApp(const ExampleApp());
class ExampleApp extends StatelessWidget {
const ExampleApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(home: HomePage());
}
}
/// Demonstrates the instance-based SpareLink API:
/// 1. [SpareLink.start] — launch the payment flow
/// 2. [SpareLink.handleRedirect] — forward deep-link return URIs
/// 3. [SpareLink.resumeIfNeeded] — recover a session after a crash/cold start
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
late final SpareLink _spareLink;
@override
void initState() {
super.initState();
_spareLink = SpareLink(
environment: PaymentEnvironment.sandbox,
tenant: SpareApiTenant.uae,
);
_spareLink.events.listen((event) => print('event: $event'));
WidgetsBinding.instance.addObserver(this);
WidgetsBinding.instance.addPostFrameCallback((_) async {
final recovery = await _spareLink.resumeIfNeeded();
switch (recovery) {
case SessionRecovered(:final result):
print('recovered: ${result.status.name}');
case NoRecoveryNeeded(:final reason):
print('no recovery: $reason');
}
});
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
_spareLink.dispose();
super.dispose();
}
@override
Future<bool> didPushRouteInformation(
RouteInformation routeInformation,
) async {
final uri = routeInformation.uri;
if (uri.scheme == 'yourapp') {
if (await _spareLink.handleRedirect(uri)) return true;
}
return super.didPushRouteInformation(routeInformation);
}
Future<void> _startPayment() async {
final session = await _spareLink.start(
navigator: Navigator.of(context),
linkToken: 'your-session-token',
);
print('session.linkToken=${session.linkToken}');
final result = await session.result;
print('result: ${result.status.name}');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('spare_link example')),
body: Center(
child: FilledButton(
onPressed: _startPayment,
child: const Text('Start Payment'),
),
),
);
}
}