sunmi_printer_x_plus 0.0.6
sunmi_printer_x_plus: ^0.0.6 copied to clipboard
A Flutter plugin for Sunmi printers that allows label printing with text, QR codes and images.
example/lib/main.dart
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:sunmi_printer_x_plus/sunmi_printer_x_plus.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
bool _isConnected = false;
final TextEditingController _productNameController = TextEditingController(text: "可口可乐");
final TextEditingController _specificationController = TextEditingController(text: "2L");
final TextEditingController _codeController = TextEditingController(text: "12345678");
final TextEditingController _unitController = TextEditingController(text: "瓶");
final TextEditingController _priceController = TextEditingController(text: "7.8");
int _copies = 1;
@override
void initState() {
super.initState();
_initPrinter();
}
// Initialize the printer
Future<void> _initPrinter() async {
try {
_isConnected = await SunmiPrinterXPlus.init();
setState(() {});
} catch (e) {
print('Error initializing printer: $e');
}
}
// Print a simple label
Future<void> _printSimpleLabel() async {
try {
await SunmiPrinterXPlus.startLabelPrint(width: 30, height: 20);
// Border box
await SunmiPrinterXPlus.drawBox(x: 0, y: 0, width: 240, height: 159);
// Title text
await SunmiPrinterXPlus.printText(
text: "品牌:SUNMI",
x: 10,
y: 10,
fontSize: 32,
bold: true,
);
// Description text
await SunmiPrinterXPlus.printText(
text: "商米是一家以为核心价值观的物联网科技公司",
x: 60,
y: 50,
fontSize: 20,
width: 160,
height: 100,
);
// Print with 1 copy
await SunmiPrinterXPlus.commitLabelPrint(copies: 1);
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Simple label printed successfully')),
);
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error printing label: $e')),
);
}
}
// Print a product label
Future<void> _printProductLabel() async {
try {
await SunmiPrinterXPlus.printProductLabel(
productName: _productNameController.text,
specification: _specificationController.text,
code: _codeController.text,
unit: _unitController.text,
price: _priceController.text,
copies: _copies,
);
print("Product label printed successfully");
} catch (e) {
print("Error printing product label: $e");
}
}
// Print a QR code
Future<void> _printQRCode() async {
try {
await SunmiPrinterXPlus.startLabelPrint(width: 30, height: 30);
// Border
await SunmiPrinterXPlus.drawBox(x: 0, y: 0, width: 240, height: 240);
// Title
await SunmiPrinterXPlus.printText(
text: "SUNMI QR Code",
x: 10,
y: 10,
fontSize: 24,
bold: true,
);
// QR Code
await SunmiPrinterXPlus.printQRCode(
data: "https://www.sunmi.com",
x: 60,
y: 50,
size: 120,
errorCorrectionLevel: QRCodeErrorCorrectionLevel.high,
);
// Print with 1 copy
await SunmiPrinterXPlus.commitLabelPrint(copies: 1);
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('QR code printed successfully')),
);
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error printing QR code: $e')),
);
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Sunmi Printer X Plus Example'),
),
body: SingleChildScrollView(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Printer status
Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Row(
children: [
Icon(
_isConnected ? Icons.check_circle : Icons.error,
color: _isConnected ? Colors.green : Colors.red,
),
const SizedBox(width: 8),
Text(
_isConnected ? "Printer connected" : "Printer disconnected",
style: Theme.of(context).textTheme.titleMedium,
),
],
),
),
),
const SizedBox(height: 16),
// Product label form
Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Product Label',
style: Theme.of(context).textTheme.titleLarge,
),
const SizedBox(height: 16),
TextField(
controller: _productNameController,
decoration: const InputDecoration(
labelText: 'Product Name',
border: OutlineInputBorder(),
),
),
const SizedBox(height: 8),
TextField(
controller: _specificationController,
decoration: const InputDecoration(
labelText: 'Specification',
border: OutlineInputBorder(),
),
),
const SizedBox(height: 8),
TextField(
controller: _codeController,
decoration: const InputDecoration(
labelText: 'Product Code',
border: OutlineInputBorder(),
),
),
const SizedBox(height: 8),
TextField(
controller: _unitController,
decoration: const InputDecoration(
labelText: 'Unit',
border: OutlineInputBorder(),
),
),
const SizedBox(height: 8),
TextField(
controller: _priceController,
decoration: const InputDecoration(
labelText: 'Price',
border: OutlineInputBorder(),
),
keyboardType: TextInputType.number,
),
const SizedBox(height: 16),
Row(
children: [
const Text('Copies: '),
IconButton(
icon: const Icon(Icons.remove),
onPressed: () {
if (_copies > 1) {
setState(() {
_copies--;
});
}
},
),
Text('$_copies'),
IconButton(
icon: const Icon(Icons.add),
onPressed: () {
setState(() {
_copies++;
});
},
),
],
),
const SizedBox(height: 16),
SizedBox(
width: double.infinity,
child: ElevatedButton(
onPressed: _isConnected ? _printProductLabel : null,
child: const Text('Print Product Label'),
),
),
],
),
),
),
const SizedBox(height: 16),
// Quick print buttons
Row(
children: [
Expanded(
child: ElevatedButton(
onPressed: _isConnected ? _printSimpleLabel : null,
child: const Text('Print Simple Label'),
),
),
const SizedBox(width: 8),
Expanded(
child: ElevatedButton(
onPressed: _isConnected ? _printQRCode : null,
child: const Text('Print QR Code'),
),
),
],
),
],
),
),
),
);
}
@override
void dispose() {
_productNameController.dispose();
_specificationController.dispose();
_codeController.dispose();
_unitController.dispose();
_priceController.dispose();
super.dispose();
}
}