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;
}