Logo
Flutter

Example

Complete Example - Main.dart

import 'dart:async';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:n2app/n2app.dart';

void main() {
  runApp(MaterialApp(home: const MyApp()));
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  bool? _appInstalled = false;
  bool _isActivated = false;

  @override
  void initState() {
    super.initState();
    initPlatformState();
  }

  Future<void> initPlatformState() async {
    String platformVersion;
    bool? isAppInstalled;
    
    try {
      platformVersion = await N2app.getPlatformVersion() ?? 'Unknown';
      isAppInstalled = await N2app.checkAppInstalled();
      
      // Warm up if installed
      if (isAppInstalled == true) {
        N2app.warmUp(
          onSuccess: (message) => print('Warm up success'),
          onFailed: (message) => print('Warm up failed'),
        );
      }
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    if (!mounted) return;

    setState(() {
      _appInstalled = isAppInstalled;
      _platformVersion = platformVersion;
    });
  }

  void _showDialog(String title, String message) {
    showDialog(
      context: context,
      builder: (context) => AlertDialog(
        title: Text(title),
        content: Text(message),
        actions: [
          TextButton(
            child: const Text('OK'),
            onPressed: () => Navigator.of(context).pop(),
          ),
        ],
      ),
    );
  }

  void _handleActivation() {
    N2app.activation(
      code: '907533140097',
      onSuccess: (message) {
        setState(() => _isActivated = true);
        _showDialog('Success', message);
      },
      onFailed: (error) => _showDialog('Error', error),
    );
  }

  void _handleSaleTransaction() {
    N2app.triggerSaleTransaction(
      amount: 10.50,
      posMessageId: '${Random().nextInt(100000)}',
      onSuccess: (result) {
        final response = result.transactionResponse;
        final message = '''
Transaction Successful!
Transaction ID: ${response?.tranId}
RRN: ${response?.rrn}
Amount: \$${response?.totalAmount}
Approval Code: ${response?.approvalCode}
        ''';
        _showDialog('Success', message);
      },
      onFailed: (error) => _showDialog('Error', error),
    );
  }

  void _handleMerchantQrTransaction() {
    N2app.triggerMerchantQrTransaction(
      amount: 15.00,
      posMessageId: 'MQR_${Random().nextInt(100000)}',
      onSuccess: (result) {
        _showDialog('Success', result.message ?? 'Transaction completed');
      },
      onFailed: (error) => _showDialog('Error', error),
    );
  }

  void _handleGuestQrTransaction() {
    N2app.triggerGuestQrTransaction(
      amount: 20.00,
      posMessageId: 'GQR_${Random().nextInt(100000)}',
      onSuccess: (result) {
        _showDialog('Success', result.message ?? 'Transaction completed');
      },
      onFailed: (error) => _showDialog('Error', error),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('N2App Payment Demo'),
        backgroundColor: Colors.blue,
      ),
      body: SingleChildScrollView(
        padding: const EdgeInsets.all(20),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: [
            Card(
              child: Padding(
                padding: const EdgeInsets.all(16),
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Text(
                      'System Status',
                      style: Theme.of(context).textTheme.titleLarge,
                    ),
                    const SizedBox(height: 10),
                    Text('Platform: $_platformVersion'),
                    Text('SoftPOS Installed: ${_appInstalled == true ? "✓" : "✗"}'),
                    Text('Activated: ${_isActivated ? "✓" : "✗"}'),
                  ],
                ),
              ),
            ),
            const SizedBox(height: 20),
            ElevatedButton.icon(
              onPressed: _appInstalled == true ? _handleActivation : null,
              icon: const Icon(Icons.verified_user),
              label: const Text('Activate Terminal'),
            ),
            const SizedBox(height: 10),
            ElevatedButton.icon(
              onPressed: _isActivated ? _handleSaleTransaction : null,
              icon: const Icon(Icons.credit_card),
              label: const Text('Sale Transaction (\$10.50)'),
            ),
            const SizedBox(height: 10),
            ElevatedButton.icon(
              onPressed: _isActivated ? _handleMerchantQrTransaction : null,
              icon: const Icon(Icons.qr_code),
              label: const Text('Merchant QR (\$15.00)'),
            ),
            const SizedBox(height: 10),
            ElevatedButton.icon(
              onPressed: _isActivated ? _handleGuestQrTransaction : null,
              icon: const Icon(Icons.qr_code_scanner),
              label: const Text('Guest QR (\$20.00)'),
            ),
          ],
        ),
      ),
    );
  }
}

Complete Example - Payment_Service.dart

import 'package:n2app/n2app.dart';
import 'package:n2app/model/transaction_success.dart';
import 'dart:math';

class PaymentService {
  static final PaymentService _instance = PaymentService._internal();
  factory PaymentService() => _instance;
  PaymentService._internal();

  bool _isWarmedUp = false;
  bool _isActivated = false;

  Future<bool> initialize() async {
    try {
      final isInstalled = await N2app.checkAppInstalled();
      if (isInstalled != true) {
        return false;
      }

      await warmUp();
      return true;
    } catch (e) {
      print('Initialization error: $e');
      return false;
    }
  }

  Future<void> warmUp() async {
    if (_isWarmedUp) return;

    await N2app.warmUp(
      onSuccess: (message) {
        _isWarmedUp = true;
        print('Warm up successful');
      },
      onFailed: (error) {
        print('Warm up failed: $error');
      },
    );
  }

  Future<bool> activate(String code) async {
    final completer = Completer<bool>();

    N2app.activation(
      code: code,
      onSuccess: (message) {
        _isActivated = true;
        completer.complete(true);
      },
      onFailed: (error) {
        completer.complete(false);
      },
    );

    return completer.future;
  }

  Future<Transactionsuccess?> processSale({
    required double amount,
    String? customMessageId,
  }) async {
    final completer = Completer<Transactionsuccess?>();
    final messageId = customMessageId ?? 
                      'SALE_${DateTime.now().millisecondsSinceEpoch}';

    N2app.triggerSaleTransaction(
      amount: amount,
      posMessageId: messageId,
      onSuccess: (result) => completer.complete(result),
      onFailed: (error) {
        print('Sale failed: $error');
        completer.complete(null);
      },
    );

    return completer.future;
  }

  Future<Transactionsuccess?> processMerchantQr({
    required double amount,
    String? customMessageId,
  }) async {
    final completer = Completer<Transactionsuccess?>();
    final messageId = customMessageId ?? 
                      'MQR_${DateTime.now().millisecondsSinceEpoch}';

    N2app.triggerMerchantQrTransaction(
      amount: amount,
      posMessageId: messageId,
      onSuccess: (result) => completer.complete(result),
      onFailed: (error) {
        print('Merchant QR failed: $error');
        completer.complete(null);
      },
    );

    return completer.future;
  }

  Future<Transactionsuccess?> processGuestQr({
    required double amount,
    String? customMessageId,
  }) async {
    final completer = Completer<Transactionsuccess?>();
    final messageId = customMessageId ?? 
                      'GQR_${DateTime.now().millisecondsSinceEpoch}';

    N2app.triggerGuestQrTransaction(
      amount: amount,
      posMessageId: messageId,
      onSuccess: (result) => completer.complete(result),
      onFailed: (error) {
        print('Guest QR failed: $error');
        completer.complete(null);
      },
    );

    return completer.future;
  }

  bool get isActivated => _isActivated;
  bool get isWarmedUp => _isWarmedUp;
}

On this page