msrx_flutter 0.1.0
msrx_flutter: ^0.1.0 copied to clipboard
A Flutter plugin for MSR605X magnetic stripe card reader supporting Windows, Android, and Linux.
import 'package:flutter/material.dart';
import 'package:msrx_flutter/msrx.dart';
import 'package:msrx_flutter/track_data.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'MSRX Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MSRXDemoPage(),
);
}
}
class MSRXDemoPage extends StatefulWidget {
const MSRXDemoPage({Key? key}) : super(key: key);
@override
State<MSRXDemoPage> createState() => _MSRXDemoPageState();
}
class _MSRXDemoPageState extends State<MSRXDemoPage> {
final MSRX _msrx = MSRX();
bool _isConnected = false;
String _statusMessage = 'Not connected';
TrackData? _cardData;
final TextEditingController _track1Controller = TextEditingController();
final TextEditingController _track2Controller = TextEditingController();
final TextEditingController _track3Controller = TextEditingController();
@override
void initState() {
super.initState();
_setupConnectionListener();
}
void _setupConnectionListener() {
_msrx.connectionStatus.listen((connected) {
setState(() {
_isConnected = connected;
_statusMessage = connected ? 'Connected' : 'Disconnected';
});
});
}
Future<void> _connect() async {
setState(() {
_statusMessage = 'Connecting...';
});
try {
bool connected = await _msrx.connect();
setState(() {
_isConnected = connected;
_statusMessage = connected ? 'Connected' : 'Connection failed';
});
} catch (e) {
setState(() {
_statusMessage = 'Connection error: $e';
});
}
}
Future<void> _disconnect() async {
try {
await _msrx.disconnect();
setState(() {
_isConnected = false;
_statusMessage = 'Disconnected';
});
} catch (e) {
setState(() {
_statusMessage = 'Disconnect error: $e';
});
}
}
Future<void> _readCard() async {
if (!_isConnected) {
setState(() {
_statusMessage = 'Not connected';
});
return;
}
setState(() {
_statusMessage = 'Reading card...';
});
try {
_cardData = await _msrx.readCard(timeout: 5000);
setState(() {
_statusMessage = 'Card read successfully';
});
} catch (e) {
setState(() {
_statusMessage = 'Read error: $e';
_cardData = null;
});
}
}
Future<void> _writeCard() async {
if (!_isConnected) {
setState(() {
_statusMessage = 'Not connected';
});
return;
}
setState(() {
_statusMessage = 'Writing card...';
});
try {
TrackData dataToWrite = TrackData(
track1: _track1Controller.text.isNotEmpty ? _track1Controller.text : null,
track2: _track2Controller.text.isNotEmpty ? _track2Controller.text : null,
track3: _track3Controller.text.isNotEmpty ? _track3Controller.text : null,
);
bool success = await _msrx.writeCard(dataToWrite);
setState(() {
_statusMessage = success ? 'Card written successfully' : 'Write failed';
});
} catch (e) {
setState(() {
_statusMessage = 'Write error: $e';
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('MSRX Demo'),
),
body: SingleChildScrollView(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// Status section
Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Status: $_statusMessage',
style: const TextStyle(fontSize: 16),
),
const SizedBox(height: 16),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
ElevatedButton(
onPressed: _isConnected ? null : _connect,
child: const Text('Connect'),
),
ElevatedButton(
onPressed: _isConnected ? _disconnect : null,
child: const Text('Disconnect'),
),
],
),
],
),
),
),
const SizedBox(height: 16),
// Read card section
Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'Read Card',
style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
const SizedBox(height: 16),
ElevatedButton(
onPressed: _isConnected ? _readCard : null,
child: const Text('Read Card'),
),
const SizedBox(height: 16),
if (_cardData != null) ...[
const Text('Card Data:'),
const SizedBox(height: 8),
Text('Track 1: ${_cardData!.track1 ?? 'N/A'}'),
Text('Track 2: ${_cardData!.track2 ?? 'N/A'}'),
Text('Track 3: ${_cardData!.track3 ?? 'N/A'}'),
],
],
),
),
),
const SizedBox(height: 16),
// Write card section
Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'Write Card',
style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
const SizedBox(height: 16),
TextField(
controller: _track1Controller,
decoration: const InputDecoration(
labelText: 'Track 1',
hintText: 'e.g. %B4111111111111111^SMITH/JOHN^2511?',
),
),
const SizedBox(height: 8),
TextField(
controller: _track2Controller,
decoration: const InputDecoration(
labelText: 'Track 2',
hintText: 'e.g. 4111111111111111=2511?',
),
),
const SizedBox(height: 8),
TextField(
controller: _track3Controller,
decoration: const InputDecoration(
labelText: 'Track 3 (optional)',
),
),
const SizedBox(height: 16),
ElevatedButton(
onPressed: _isConnected ? _writeCard : null,
child: const Text('Write Card'),
),
],
),
),
),
],
),
),
);
}
@override
void dispose() {
_track1Controller.dispose();
_track2Controller.dispose();
_track3Controller.dispose();
_msrx.disconnect();
super.dispose();
}
}