import 'package:flutter/material.dart'; import 'package:qr_flutter/qr_flutter.dart'; class UpiScreen extends StatefulWidget { const UpiScreen({super.key}); @override State createState() => _UpiScreenState(); } class _UpiScreenState extends State { final TextEditingController accountCtrl = TextEditingController(); final TextEditingController ifscCtrl = TextEditingController(); final TextEditingController nameCtrl = TextEditingController(); String? upiUri; /// Build UPI URI using Account Number + IFSC /// Follows NPCI UPI URI standards (upi://pay?pa=...&pn=...&cu=INR) /// Supported by UPI QR generators like Labnol which accept bank account + IFSC as payment address. String buildUpiUri({ required String accountNumber, required String ifsc, required String name, }) { final upiAddress = "$accountNumber@apl"; //const upiAddress = "asifarbaj-2@okaxis"; final uri = Uri( scheme: "upi", host: "pay", queryParameters: { "pa": upiAddress, "pn": name, "cu": "INR", }, ); return uri.toString(); } void generateQr() { final account = accountCtrl.text.trim(); final ifsc = ifscCtrl.text.trim(); final name = nameCtrl.text.trim(); if (account.isEmpty || ifsc.isEmpty || name.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text("Please fill all fields")), ); return; } setState(() { upiUri = buildUpiUri( accountNumber: account, ifsc: ifsc, name: name, ); }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text("Receive Money by UPI"), centerTitle: true, ), body: Padding( padding: const EdgeInsets.all(20), child: SingleChildScrollView( child: Column( children: [ TextField( controller: accountCtrl, decoration: const InputDecoration( labelText: "Account Number", border: OutlineInputBorder(), ), keyboardType: TextInputType.number, ), const SizedBox(height: 15), TextField( controller: ifscCtrl, decoration: const InputDecoration( labelText: "IFSC Code", border: OutlineInputBorder(), ), ), const SizedBox(height: 15), TextField( controller: nameCtrl, decoration: const InputDecoration( labelText: "Account Holder Name", border: OutlineInputBorder(), ), ), const SizedBox(height: 25), ElevatedButton( onPressed: generateQr, child: const Text("Generate QR"), ), const SizedBox(height: 30), if (upiUri != null) ...[ const Text( "Your UPI QR Code:", style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), const SizedBox(height: 15), QrImageView( data: upiUri!, version: QrVersions.auto, size: 260, backgroundColor: Colors.white, ), const SizedBox(height: 10), SelectableText( upiUri!, textAlign: TextAlign.center, ), ], ], ), ), ), ); } }