UPI small base
This commit is contained in:
137
lib/features/service/screens/upi_screen.dart
Normal file
137
lib/features/service/screens/upi_screen.dart
Normal file
@@ -0,0 +1,137 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:qr_flutter/qr_flutter.dart';
|
||||
|
||||
class UpiScreen extends StatefulWidget {
|
||||
const UpiScreen({super.key});
|
||||
|
||||
@override
|
||||
State<UpiScreen> createState() => _UpiScreenState();
|
||||
}
|
||||
|
||||
class _UpiScreenState extends State<UpiScreen> {
|
||||
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,
|
||||
),
|
||||
],
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user