flutter_bakong_payway 1.0.3 copy "flutter_bakong_payway: ^1.0.3" to clipboard
flutter_bakong_payway: ^1.0.3 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',
                        ),
                      ),
                    ],
                  ),
                ),
              ),
            ],
          ],
        ),
      ),
    );
  }
}
4
likes
0
points
212
downloads

Publisher

unverified uploader

Weekly Downloads

A Flutter plugin for generating Bakong KHQR payment codes. Supports Android, iOS, and Web. KHQR is Cambodia's centralized QR payment system.

Repository (GitHub)
View/report issues

Topics

#payment #qrcode #cambodia #bakong #khqr

License

unknown (license)

Dependencies

flutter, flutter_web_plugins, plugin_platform_interface, web

More

Packages that depend on flutter_bakong_payway

Packages that implement flutter_bakong_payway