kiosk_utilities 0.0.1
kiosk_utilities: ^0.0.1 copied to clipboard
A kiosk utilities plugin to print on kiosk's embedded printer. Currently supports Sunmi K2, K2 Pro, K2 Mini, and Telpo K10
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:kiosk_utilities/kiosk_utilities.dart';
const loremIpsum =
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ex metus, mattis a auctor eget, dignissim in nunc. Praesent efficitur, velit sit amet lacinia pharetra, dui lorem fermentum libero, eget ullamcorper augue mi vel orci. Nullam nisl odio, facilisis ac sapien non, aliquet sollicitudin velit. Ut blandit lacus sed ligula auctor, at ullamcorper nibh elementum.";
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await KioskUtilities.initializePrinter();
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
int? paperWidth;
Printer? printer;
late PrintAlignment printAlignment;
@override
void initState() {
super.initState();
printer = KioskUtilities.printer;
printAlignment = PrintAlignment.left;
_loadPrinterConfig().then((value) => setState(() {}));
}
Future<void> _loadPrinterConfig() async {
final printer = this.printer;
if (printer == null) return;
paperWidth = (await printer.getPaperWidth())?.dots;
}
Future<void> _printSampleText() async {
await printer?.escPos([
SetPrintAlignment(alignment: printAlignment),
const PrintText(text: "Sample Text"),
LineFeed(),
const PrintText(text: loremIpsum),
LineFeed(),
const CutPaper.functionB(n: 5),
]);
}
Future<void> _printTable() async {
final paperWidth = this.paperWidth;
final printer = this.printer;
if (paperWidth == null || printer == null) return;
const textStyle = TextStyle(
fontSize: 24,
color: Color(0xFF000000),
fontWeight: FontWeight.w400,
);
final bitmapBuilder = BitmapBuilder(
width: paperWidth,
paddingTop: 10,
paddingBottom: 10,
paddingLeft: 10,
paddingRight: 10,
defaultTextStyle: textStyle,
)
..text(BitmapText(
"Receipt",
textAlign: TextAlign.center,
style: const TextStyle(
fontSize: 42,
color: Color(0xFF000000),
fontStyle: FontStyle.italic,
fontWeight: FontWeight.bold,
decoration: TextDecoration.underline,
),
))
..space(30)
..table(
columnsWidth: [-1, paperWidth / 3, paperWidth / 3],
cellPadding: const CellPadding.all(10),
border: true,
texts: [
BitmapText("Nama", style: textStyle.copyWith(fontWeight: FontWeight.bold)),
BitmapText(
"Harga",
textAlign: TextAlign.right,
style: textStyle.copyWith(fontWeight: FontWeight.bold),
),
BitmapText(
"Qty",
textAlign: TextAlign.right,
style: textStyle.copyWith(fontWeight: FontWeight.bold),
),
BitmapText("Apple Fuji"),
BitmapText("23.000", textAlign: TextAlign.right),
BitmapText("5", textAlign: TextAlign.right),
BitmapText("Pisang Cavendish Christmas Package"),
BitmapText("15.000", textAlign: TextAlign.right),
BitmapText("10", textAlign: TextAlign.right),
BitmapText("Cherry"),
BitmapText("27.000", textAlign: TextAlign.right),
BitmapText("1", textAlign: TextAlign.right),
],
)
..finish();
final bitmapData = await bitmapBuilder.build();
final escPos = EscPosBuilder()
..initializePrinter()
..setAlignment(printAlignment)
..lineFeed()
..printBitmapFromPixels(
byteColors: bitmapData!.colorBytes,
width: bitmapData.width,
height: bitmapData.height,
)
..lineFeed()
..lineFeed()
..cutPaper(paperCut: const CutPaper.functionB(n: 5));
await printer.escPos(escPos.build());
}
Future<void> _printQrCode() async {
final escPos = EscPosBuilder()
..setAlignment(printAlignment)
..lineFeed()
..printQrCode("QR Code content")
..lineFeed()
..lineFeed()
..cutPaper(paperCut: const CutPaper.functionB(n: 5));
await printer?.escPos(escPos.build());
}
Future<void> _printBitmapImage() async {
final qiosLogo = await rootBundle.load("assets/logo.bmp");
final escPos = EscPosBuilder()
..setAlignment(printAlignment)
..lineFeed()
..printBitmapFromBinary(qiosLogo.buffer.asUint8List())
..lineFeed()
..lineFeed()
..cutPaper(paperCut: const CutPaper.functionB(n: 5));
await printer?.escPos(escPos.build());
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: ListView(
padding: const EdgeInsets.all(16),
children: [
Text(
"Printer (${paperWidth ?? "-"} dots)",
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.w500,
),
),
const SizedBox(height: 8),
const Divider(height: 0),
const SizedBox(height: 16),
const Text("Set Alignment"),
const SizedBox(height: 4),
SegmentedButton(
style: const ButtonStyle(
visualDensity: VisualDensity.compact,
),
onSelectionChanged: (selections) {
final value = selections.firstOrNull;
if (value == null) return;
setState(() => printAlignment = value);
},
segments: const [
ButtonSegment(
value: PrintAlignment.left,
icon: Icon(Icons.format_align_left),
),
ButtonSegment(
value: PrintAlignment.center,
icon: Icon(Icons.format_align_center),
),
ButtonSegment(
value: PrintAlignment.right,
icon: Icon(Icons.format_align_right),
),
],
selected: {printAlignment},
),
const SizedBox(height: 16),
ListTile(
leading: const Icon(Icons.text_fields),
title: const Text("Print Text"),
trailing: const Icon(Icons.chevron_right),
onTap: () => _printSampleText(),
),
ListTile(
leading: const Icon(Icons.table_view),
title: const Text("Print Table (Bitmap)"),
trailing: const Icon(Icons.chevron_right),
onTap: () => _printTable(),
),
ListTile(
leading: const Icon(Icons.qr_code_2),
title: const Text("Print QR Code"),
trailing: const Icon(Icons.chevron_right),
onTap: () => _printQrCode(),
),
ListTile(
leading: const Icon(Icons.image_outlined),
title: const Text("Print Bitmap Image"),
trailing: const Icon(Icons.chevron_right),
onTap: () => _printBitmapImage(),
),
],
),
),
);
}
}