dopos_print 0.1.5
dopos_print: ^0.1.5 copied to clipboard
***** EASY TO USE ***** The dopos_print plugin is a Flutter plugin designed to interface with thermal printers on Windows and Android (Bluetooth printers) OR Ethernet Printers. This plugin enables Flu [...]
example/lib/main.dart
import 'dart:convert';
import 'dart:developer';
import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:io';
import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart';
import 'package:dopos_print/dopos_print.dart';
import 'package:permission_handler/permission_handler.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
// Request Bluetooth permissions
await _requestBluetoothPermission();
runApp(const MyApp());
}
Future<void> _requestBluetoothPermission() async {
if (Platform.isAndroid) {
await _requestBluetoothPermissions();
await _requestLocationPermission();
}
}
Future<void> _requestBluetoothPermissions() async {
PermissionStatus bluetoothScanPermission =
await Permission.bluetoothScan.request();
PermissionStatus bluetoothConnectPermission =
await Permission.bluetoothConnect.request();
if (bluetoothScanPermission.isGranted &&
bluetoothConnectPermission.isGranted) {
print("Bluetooth permissions granted");
} else {
print("Bluetooth permissions denied");
if (bluetoothScanPermission.isPermanentlyDenied ||
bluetoothConnectPermission.isPermanentlyDenied) {
openAppSettings();
}
}
}
Future<void> _requestLocationPermission() async {
PermissionStatus locationPermission =
await Permission.locationWhenInUse.request();
if (locationPermission.isGranted) {
print("Location permission granted");
} else if (locationPermission.isDenied) {
print("Location permission denied");
} else if (locationPermission.isPermanentlyDenied) {
openAppSettings();
}
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final DoposPrint _doposPrintPlugin = DoposPrint();
List<Map<String, String>> _printers = [];
String _jsonInput = '';
String? _selectedPrinter;
late Map<String, dynamic> _SAMPLE_JSON_INSTRUCTION_58MM,
_SAMPLE_JSON_INSTRUCTION_80MM;
TextEditingController _jsonD = TextEditingController();
// New variables for LAN printing option
TextEditingController _ipController = TextEditingController();
TextEditingController _portController = TextEditingController();
String _printerType = 'Bluetooth'; // To track which radio option is selected
@override
void initState() {
super.initState();
_checkPermissions();
}
Future<void> _checkPermissions() async {
if (await Permission.bluetoothConnect.request().isGranted) {
await _preparePrintInstructions();
_jsonD.text = jsonEncode(_SAMPLE_JSON_INSTRUCTION_80MM).toString();
_loadPrinters();
} else {
// Handle permission denial gracefully
print('Bluetooth/Storage permission denied!');
}
}
Future<void> _preparePrintInstructions() async {
final image = await _loadImagePathFromAssets('assets/images/image.png');
_SAMPLE_JSON_INSTRUCTION_80MM = {
"printerWidth": 576,
"charLimit": 48,
"startX": 0,
"startY": 0,
"data": [
{
"startX": 0,
"endX": 100,
"lineSpacing": 0,
"imagePath": image,
"imageWidth": 100,
"imageHeight": 120,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "ABDULLAH'S STORE",
"fontSize": 12,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": " ",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "DANGAPARA, SULTANPUR, BURDWAN",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "Phone: 8765346533",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "GSTIN: ",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "................................................",
"fontSize": 8,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": " ",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "TAX INVOICE",
"fontSize": 10,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": " ",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 50,
"text": "Date: 27/09/24",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 50,
"endX": 100,
"text": "Time: 22:12:03",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "Bill No.: D9S1O0083",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "................................................",
"fontSize": 8,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 1,
"endX": 40,
"text": "ITEM NAME",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 40,
"endX": 55,
"text": "MRP",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 55,
"endX": 70,
"text": "RATE",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 70,
"endX": 85,
"text": "QTY",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 85,
"endX": 100,
"text": "TOTAL",
"fontSize": 8,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 1,
"endX": 40,
"text": "1.ABDULLAH BEST ITEM .",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 40,
"endX": 55,
"text": "160.00",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 55,
"endX": 70,
"text": "150.00",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 70,
"endX": 85,
"text": "1.000",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 85,
"endX": 100,
"text": "150.00",
"fontSize": 8,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 1,
"endX": 40,
"text": "2.DERMI COOL POWDER 150G.",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 40,
"endX": 55,
"text": "145.00",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 55,
"endX": 70,
"text": "122.88",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 70,
"endX": 85,
"text": "1.000",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 85,
"endX": 100,
"text": "145.00",
"fontSize": 8,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "................................................",
"fontSize": 8,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 40,
"text": "Total",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 40,
"endX": 100,
"text": "295.00",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 40,
"text": "Tax Amt.",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 40,
"endX": 100,
"text": "22.12",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 40,
"text": "Round off",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 40,
"endX": 100,
"text": "0.00",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": " ",
"fontSize": 10,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "Net Payable: 295",
"fontSize": 10,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": " ",
"fontSize": 10,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "ITEM(S)/QTY: 2/2.000",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "TOTAL INCL. OF ALL GST TAX.",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "************************************************",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 1,
"endX": 20,
"text": "TAX%",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 20,
"endX": 40,
"text": "TAXABLE",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 40,
"endX": 60,
"text": "CGST",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 60,
"endX": 78,
"text": "SGST",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 78,
"endX": 98,
"text": "AMT",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "................................................",
"fontSize": 8,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 1,
"endX": 20,
"text": "0.0%",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 20,
"endX": 40,
"text": "150.00",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 40,
"endX": 60,
"text": "0.00",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 60,
"endX": 78,
"text": "0.00",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 78,
"endX": 98,
"text": "0.00",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 1,
"endX": 20,
"text": "18.0%",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 20,
"endX": 40,
"text": "122.88",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 40,
"endX": 60,
"text": "11.06",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 60,
"endX": 78,
"text": "11.06",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 78,
"endX": 98,
"text": "22.12",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "************************************************",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "YOU SAVED: 10.00",
"fontSize": 10,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "********************************",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 60,
"text": "Payment Mode:",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 60,
"endX": 100,
"text": "CASH",
"fontSize": 8,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 60,
"text": "CASH:",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 60,
"endX": 100,
"text": "295.00",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "................................................",
"fontSize": 8,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "Thank You, Visit again!!!",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
}
]
};
_SAMPLE_JSON_INSTRUCTION_58MM = {
"printerWidth": 384,
"charLimit": 32,
"startX": 0,
"startY": 0,
"data": [
{
"startX": 0,
"endX": 100,
"lineSpacing": 0,
"imagePath": image,
"imageWidth": 100,
"imageHeight": 120,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": " ",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "DANGAPARA, SULTANPUR, BURDWAN",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "Phone: 8765346533",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "GSTIN: ",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "................................",
"fontSize": 8,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": " ",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "TAX INVOICE",
"fontSize": 10,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": " ",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 50,
"text": "Date: 15/08/24",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 50,
"endX": 100,
"text": "Time: 09:58:09",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "Bill No.: D9S1O0004",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "................................",
"fontSize": 8,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 15,
"text": "Sl.",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 15,
"endX": 68,
"text": "ITEM",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 71,
"endX": 100,
"text": "MRP",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 25,
"text": "RATE",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 25,
"endX": 50,
"text": "QTY",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 50,
"endX": 75,
"text": "TAX%",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 75,
"endX": 100,
"text": "TOTAL",
"fontSize": 8,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "................................",
"fontSize": 8,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 15,
"text": "1.",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 15,
"endX": 68,
"text": "RACIRAFT SYRUP 250ML.",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 70,
"endX": 100,
"text": "215.00",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 25,
"text": "182.20",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 25,
"endX": 50,
"text": "1.000",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 50,
"endX": 75,
"text": "18.00",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 75,
"endX": 100,
"text": "215.00",
"fontSize": 8,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "................................",
"fontSize": 8,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 40,
"text": "Total",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 40,
"endX": 100,
"text": "215.00",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 40,
"text": "Tax Amt.",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 40,
"endX": 100,
"text": "32.80",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 40,
"text": "Round off",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 40,
"endX": 100,
"text": "0.00",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": " ",
"fontSize": 10,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "Net Payable: 215",
"fontSize": 10,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": " ",
"fontSize": 10,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "ITEM(S)/QTY: 1/1.000",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "TOTAL INCL. OF ALL GST TAX.",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "********************************",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 50,
"text": "TAX%",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 50,
"endX": 100,
"text": "TAXABLE",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 33,
"text": "CGST",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 33,
"endX": 63,
"text": "SGST",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 65,
"endX": 100,
"text": "TAX AMT",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "................................",
"fontSize": 8,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 50,
"text": "18.0%",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 50,
"endX": 100,
"text": "182.20",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 33,
"text": "16.40",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 33,
"endX": 64,
"text": "16.40",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": false
},
{
"startX": 65,
"endX": 100,
"text": "32.80",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "********************************",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "YOU SAVED: 0.00",
"fontSize": 10,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "********************************",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 60,
"text": "Payment Mode:",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 60,
"endX": 100,
"text": "CASH",
"fontSize": 8,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 60,
"text": "CASH:",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "left",
"isNewLine": false
},
{
"startX": 60,
"endX": 100,
"text": "215.00",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "right",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "................................",
"fontSize": 8,
"fontWeight": "Bold",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
},
{
"startX": 0,
"endX": 100,
"text": "Thank You, Visit again!!!",
"fontSize": 8,
"fontWeight": "Normal",
"lineSpacing": 0,
"align": "center",
"isNewLine": true
}
]
};
setState(() {});
}
Future<String> _loadImagePathFromAssets(String assetPath) async {
final byteData = await rootBundle.load(assetPath);
final tempDir = await getTemporaryDirectory();
final file = File('${tempDir.path}/image.png');
await file.writeAsBytes(byteData.buffer.asUint8List(), flush: true);
return file.path;
}
Future<void> _loadPrinters() async {
try {
final printers = await _doposPrintPlugin.listPrinters();
setState(() {
_printers = printers;
});
} catch (e) {
log('Failed to load printers: $e');
}
}
Future<void> _print() async {
_jsonInput = _jsonD.text;
if (_jsonInput.isEmpty) {
log('Please enter JSON data.');
return;
}
try {
final tempDir = await getTemporaryDirectory();
final tempFile = File('${tempDir.path}/printInstructions.json');
await tempFile.writeAsString(_jsonInput);
if (_printerType == 'Bluetooth' && _selectedPrinter != null) {
await _doposPrintPlugin.print(
int.parse(_selectedPrinter!),
tempFile.path,
);
} else if (_printerType == 'LAN') {
String ip = _ipController.text;
String port = _portController.text;
if (ip.isNotEmpty && port.isNotEmpty) {
await _doposPrintPlugin.ethernetPrint(ip, port, tempFile.path);
} else {
log('Please enter both IP and Port.');
}
}
log('Print command sent successfully.');
} on PlatformException catch (e) {
log('Failed to send print command: ${e.message}');
} catch (e) {
log('Error: $e');
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Printer App',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: const Text('Printer App'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const SizedBox(height: 20),
// Radio buttons to select printer type (Bluetooth or LAN)
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Radio<String>(
value: 'Bluetooth',
groupValue: _printerType,
onChanged: (String? value) {
setState(() {
_printerType = value!;
});
},
),
const Text('Bluetooth Printer'),
Radio<String>(
value: 'LAN',
groupValue: _printerType,
onChanged: (String? value) {
setState(() {
_printerType = value!;
});
},
),
const Text('LAN Printer'),
],
),
const SizedBox(height: 20),
if (_printerType == 'Bluetooth' && _printers.isNotEmpty)
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: DropdownButton<String>(
hint: const Text('Select Printer'),
value: _selectedPrinter,
onChanged: (String? newValue) {
setState(() {
_selectedPrinter = newValue;
});
},
items: _printers.map((printer) {
final printerIndex = printer.keys.first;
final printerName = printer.values.first;
log("$printerIndex===>$printerName");
return DropdownMenuItem<String>(
value: printerIndex, // Ensure printerIndex is unique
child: Row(
children: <Widget>[
const Icon(Icons.print),
const SizedBox(width: 10),
Text(printerName),
],
),
);
}).toList(),
),
),
// If LAN printer is selected, show IP and Port input fields
if (_printerType == 'LAN')
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Column(
children: [
TextField(
controller: _ipController,
keyboardType: TextInputType.number,
decoration: const InputDecoration(
labelText: 'IP Address',
border: OutlineInputBorder(),
),
),
const SizedBox(height: 10),
TextField(
controller: _portController,
keyboardType: TextInputType.number,
decoration: const InputDecoration(
labelText: 'Port',
border: OutlineInputBorder(),
),
),
],
),
),
const SizedBox(height: 20),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: TextField(
controller: _jsonD,
maxLines: 10,
decoration: const InputDecoration(
border: OutlineInputBorder(),
labelText: 'Enter JSON Data',
),
),
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: _print,
child: const Text('Print'),
),
],
),
),
),
);
}
}