flutter_bakong_payway 1.0.0
flutter_bakong_payway: ^1.0.0 copied to clipboard
A Flutter plugin for generating Bakong KHQR payment codes. Supports Android, iOS, and Web. KHQR is Cambodia's centralized QR payment system.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:flutter_bakong_payway/flutter_bakong_payway.dart';
import 'package:qr_flutter/qr_flutter.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Bakong KHQR Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
useMaterial3: true,
),
home: const KHQRDemoPage(),
);
}
}
class KHQRDemoPage extends StatefulWidget {
const KHQRDemoPage({super.key});
@override
State<KHQRDemoPage> createState() => _KHQRDemoPageState();
}
class _KHQRDemoPageState extends State<KHQRDemoPage> {
final _bakongPayway = FlutterBakongPayway();
String? _qrData;
String? _md5;
String? _error;
bool _isLoading = false;
KHQRCurrency _selectedCurrency = KHQRCurrency.khr;
String _platformVersion = 'Unknown';
@override
void initState() {
super.initState();
_getPlatformVersion();
}
Future<void> _getPlatformVersion() async {
try {
final version = await _bakongPayway.getPlatformVersion();
setState(() {
_platformVersion = version ?? 'Unknown';
});
} catch (e) {
setState(() {
_platformVersion = 'Error: $e';
});
}
}
Future<void> _generateIndividualQR() async {
setState(() {
_isLoading = true;
_error = null;
_qrData = null;
_md5 = null;
});
try {
final info = IndividualInfo(
accountId: 'jonhsmith@wing',
merchantName: 'John Smith',
currency: _selectedCurrency,
amount: 100.0,
acquiringBank: 'Dev Bank',
accountInformation: 'Payment for services',
);
final result = await _bakongPayway.generateIndividualQR(info);
setState(() {
_qrData = result?.qr;
_md5 = result?.md5;
_isLoading = false;
});
} catch (e) {
setState(() {
_error = e.toString();
_isLoading = false;
});
}
}
Future<void> _generateMerchantQR() async {
setState(() {
_isLoading = true;
_error = null;
_qrData = null;
_md5 = null;
});
try {
final info = MerchantInfo(
accountId: 'merchant@aba',
merchantId: 'M001',
merchantName: 'ABC Store',
acquiringBank: 'ABA Bank',
currency: _selectedCurrency,
amount: 50.0,
merchantCity: 'Phnom Penh',
);
final result = await _bakongPayway.generateMerchantQR(info);
setState(() {
_qrData = result?.qr;
_md5 = result?.md5;
_isLoading = false;
});
} catch (e) {
setState(() {
_error = e.toString();
_isLoading = false;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Bakong KHQR Demo'),
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
),
body: SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// Platform version
Card(
child: Padding(
padding: const EdgeInsets.all(16),
child: Text(
'Platform: $_platformVersion',
style: Theme.of(context).textTheme.bodyLarge,
),
),
),
const SizedBox(height: 16),
// Currency selector
Card(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Select Currency',
style: Theme.of(context).textTheme.titleMedium,
),
const SizedBox(height: 8),
SegmentedButton<KHQRCurrency>(
segments: const [
ButtonSegment(
value: KHQRCurrency.usd,
label: Text('USD'),
icon: Icon(Icons.attach_money),
),
ButtonSegment(
value: KHQRCurrency.khr,
label: Text('KHR'),
icon: Icon(Icons.money),
),
],
selected: {_selectedCurrency},
onSelectionChanged: (Set<KHQRCurrency> selected) {
setState(() {
_selectedCurrency = selected.first;
});
},
),
],
),
),
),
const SizedBox(height: 16),
// Action buttons
Row(
children: [
Expanded(
child: ElevatedButton.icon(
onPressed: _isLoading ? null : _generateIndividualQR,
icon: const Icon(Icons.person),
label: const Text('Individual QR'),
),
),
const SizedBox(width: 16),
Expanded(
child: ElevatedButton.icon(
onPressed: _isLoading ? null : _generateMerchantQR,
icon: const Icon(Icons.store),
label: const Text('Merchant QR'),
),
),
],
),
const SizedBox(height: 24),
// Loading indicator
if (_isLoading) const Center(child: CircularProgressIndicator()),
// Error message
if (_error != null)
Card(
color: Colors.red.shade100,
child: Padding(
padding: const EdgeInsets.all(16),
child: Text(
'Error: $_error',
style: TextStyle(color: Colors.red.shade900),
),
),
),
// QR Code display
if (_qrData != null) ...[
Card(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
children: [
Text(
'Generated QR Code',
style: Theme.of(context).textTheme.titleLarge,
),
const SizedBox(height: 16),
Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.3),
spreadRadius: 2,
blurRadius: 5,
),
],
),
child: QrImageView(
data: _qrData!,
version: QrVersions.auto,
size: 250,
backgroundColor: Colors.white,
),
),
const SizedBox(height: 16),
if (_md5 != null)
Text(
'MD5: $_md5',
style: Theme.of(context).textTheme.bodySmall,
),
],
),
),
),
const SizedBox(height: 16),
// QR Data display
Card(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'QR Data',
style: Theme.of(context).textTheme.titleMedium,
),
const SizedBox(height: 8),
SelectableText(
_qrData!,
style: Theme.of(context).textTheme.bodySmall?.copyWith(
fontFamily: 'monospace',
),
),
],
),
),
),
],
],
),
),
);
}
}