getPrinters method

void getPrinters({
  1. Duration refreshDuration = const Duration(seconds: 5),
  2. List<ConnectionType> connectionTypes = const [ConnectionType.BLE, ConnectionType.USB],
})

Implementation

void getPrinters({
  Duration refreshDuration = const Duration(seconds: 5),
  List<ConnectionType> connectionTypes = const [
    ConnectionType.BLE,
    ConnectionType.USB,
  ],
}) async {
  if (connectionTypes.isEmpty) {
    return;
  }
  if (refresher != null) {
    refresher?.cancel();
    refresher = null;
  }
  List<Printer> btlist = [];
  if (connectionTypes.contains(ConnectionType.BLE)) {
    if (subscription != null) {
      subscription?.cancel();
      subscription = null;
    }
    await FlutterBluePlus.stopScan();
    await FlutterBluePlus.startScan();
    final systemDevices = (await FlutterBluePlus.systemDevices)
        .map((e) => Printer(
              address: e.remoteId.str,
              name: e.platformName,
              connectionType: ConnectionType.BLE,
              isConnected: e.isConnected,
            ))
        .toList();
    btlist.addAll(systemDevices);
    if (Platform.isAndroid) {
      // Bonded devices
      final bondedDevices = (await FlutterBluePlus.bondedDevices)
          .map((e) => Printer(
                address: e.remoteId.str,
                name: e.platformName,
                connectionType: ConnectionType.BLE,
                isConnected: e.isConnected,
              ))
          .toList();
      btlist.addAll(bondedDevices);
    }
    log('Scanning for BLE devices');
    subscription = FlutterBluePlus.scanResults.listen((device) {
      final devices = device.map(
        (e) {
          return Printer(
            address: e.device.remoteId.str,
            name: e.device.platformName,
            connectionType: ConnectionType.BLE,
            isConnected: e.device.isConnected,
          );
        },
      ).toList();
      devices.removeWhere(
        (element) => element.name == null || element.name == '',
      );
      //  If the device is already in the list, update it
      for (var e in devices) {
        final index = btlist.indexWhere((i) => i.address == e.address);
        if (index < 0) {
          btlist.add(e);
        } else {
          btlist[index] = e;
        }
      }
    });
  }
  List<Printer> list = [];
  if (connectionTypes.contains(ConnectionType.USB)) {
    _usbSubscription?.cancel();
    _usbSubscription =
        Stream.periodic(refreshDuration, (x) => x).listen((event) async {
      final devices =
          await FlutterThermalPrinterPlatform.instance.startUsbScan();
      List<Printer> templist = [];
      for (var e in devices) {
        final map =
            Map<String, dynamic>.from(e is String ? jsonDecode(e) : e);
        final device = Printer(
          vendorId: map['vendorId'].toString(),
          productId: map['productId'].toString(),
          name: map['name'],
          connectionType: ConnectionType.USB,
          address: map['vendorId'].toString(),
          isConnected: false,
        );
        final isConnected =
            await FlutterThermalPrinterPlatform.instance.isConnected(device);
        device.isConnected = isConnected;
        templist.add(device);
      }
      list = templist;
    });
  }
  refresher = Stream.periodic(refreshDuration, (x) => x).listen((event) {
    _devicesstream.add(list + btlist);
  });
}